Problema de recursión del método Java____ Problema de la Torre de Hanoi y problema de pasos de salto de rana

recursividad del método

concepto

Recurrencia de métodos: estructura del programa, que es la base en la sección de estructura de datos y algoritmos.
Estructura de datos: cómo se almacenan los datos.
Algoritmos: cómo se procesan los datos.

En conclusión

1. ¿En qué escenarios se puede usar la recursividad?
1. Un problema grande se puede dividir en varios subproblemas
2. El problema original y el subproblema tienen la misma solución excepto por las diferentes escalas de datos
3. Hay una condición de terminación recursiva.
2. ¿Qué es la recursión de métodos?
El proceso de un método que se llama a sí mismo se denomina recursividad del método (¡recuerde la semántica del método! Asegúrese de no pensar en la implementación interna)

Ejemplo: Escribe una función recursiva para implementar el factorial de 5

public class Recursion {
    
    
    public static void main(String[] args) {
    
    
        int num = 5;
        System.out.println(factor(5));

    }
    //写一个递归函数实现5!
    //一定注意方法的语义(这个方法能干嘛)
    //factor(num) 传入 num -> num!
    //5! 5 * factor (4)
    public static int factor(int num){
    
    
        //先写终止条件
        if (num == 1){
    
    
            return num;
        }
        return num * factor(num - 1);
    }
}

inserte la descripción de la imagen aquí

Ejemplo: Implementando 1+2+…+10 con recursividad

public class Recursion {
    
    
    public static void main(String[] args) {
    
    
        int num = 10;
        System.out.println(add(10));

    }
public static int add(int num){
    
    
        if (num == 1){
    
    
            return 1;
        }
        return num + add(num - 1);
    }
}

inserte la descripción de la imagen aquí

Ejemplo: ingrese un número entero no negativo y devuelva la suma de los números que lo componen

public class Recursion {
    
    
    public static void main(String[] args) {
    
    
        int num = 1729;
        System.out.println(sum(num));

    }
//输入一个非负整数,返回组成他的数字之和
public static int sum(int num){
    
    
        //num只有个数
        //终止条件
        if (num  < 10){
    
    
            return num;
        }
        //num > 10
        //能知道num的个位
        return num % 10 + sum(num / 10);
    }
}

inserte la descripción de la imagen aquí

Ejemplo: Imprimir cada dígito de un número en secuencia

public class Recursion {
    
    
    public static void main(String[] args) {
    
    
        int num = 1729;
        print(num);


    }
 //按顺序打印数字的每一位
    //传入一个num就能打印每一位的值
    public static void print(int num){
    
    
        if (num > 10){
    
    //递的过程
            //此时num还需要继续寻址最高位
            print(num / 10);
        }
        //此时说明最高位已经找到
        //%10是为了保留其他位
        System.out.print(num % 10 + " ");
    }
}

inserte la descripción de la imagen aquí

Ejemplo: pasos de salto de rana

Pregunta: Una rana puede saltar un peldaño o dos peldaños a la vez ¿De cuántas maneras puede la rana saltar n peldaños?

public class Homework2 {
    
    
    public static void main(String[] args) {
    
    
        System.out.println(frogJump(5));
    }
    /*
    例1:青蛙跳台阶问题-----斐波那契数的应用
题:一只青蛙一次可以跳上一级台阶,也可以跳上两级,求该青蛙跳上n级台阶一共有多少种跳法?
    */
    public static int frogJump(int n){
    
    
        //先找终止条件  共有一级台阶 n = 1种
        //                二           2种
        if (n == 1){
    
    
            return 1;
        }
        if (n == 2){
    
    
            return 2;
        }
        return frogJump(n-1) + frogJump(n-2);
    }
}

inserte la descripción de la imagen aquí

Ejemplo: problema de la Torre de Hanoi

inserte la descripción de la imagen aquí

¿Cómo lograr encontrar la placa más grande? Coloque n-1 discos en B. En este momento, solo queda el disco más grande
A—>C en A, y luego n-1 discos en B se ordenan secuencialmente desde B—>C

public class Homework2 {
    
    
static int count = 0;
    public static void main(String[] args) {
    
    
        int n = 3;
        char A = 'A';
        char B = 'B';
        char C = 'C';
        hanoTower(n,A,B,C);
        System.out.println("一个搬了"+count+"次盘子");
    }

 /*
    例2.汉诺塔问题
       A 起始位置
       C 目标位置
       B 辅助塔 暂存小盘子
    */
    public static void hanoTower(int nDisks,char A,char B,char C){
    
    
        if (nDisks == 1) {
    
    
            //一个盘子,直接从A--->C
            move(1,A,C);
            return;
        }
        //此时有多个盘子
        //核心步骤:先把n-1个盘子从A放到B上
        hanoTower(nDisks - 1, A, C, B);
        //此时找到了最大盘子A-->C
        move(nDisks,A,C);
        //再把B上的盘子依次从B——>C
        hanoTower(nDisks-1, B, A, C);
    }


    /*
    * 将标号为 n 的盘子从sourceTower(原塔)到distTower(目标塔)
    * */
    public static void move(int n,char sourceTower,char distTower){
    
    
    count ++;
        System.out.println("标号为"+n+"盘子从"+sourceTower+"--->"+distTower);

    }
}

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/biteqq/article/details/122699121
Recomendado
Clasificación