La forma de recursividad del método Java y algoritmo recursivo común: recursividad del método combinada con la clase File para encontrar archivos

recursividad del método

forma recursiva del método

¿Qué es la recursividad del método ?

La forma en que un método se llama a sí mismo directa o indirectamente se llama recursividad del método.

La recursión es ampliamente utilizada como algoritmo en lenguajes de programación.

Forma recursiva :

Recurrencia directa: el método se llama a sí mismo.

public static void main(String[] args) {
    
    
    test();
}

// 定义一个方法
public static void test() {
    
    
    // 直接递归方法内部调用自己
    test();
}

Recurrencia indirecta: los métodos llaman a otros métodos y otros métodos devuelven la llamada al método mismo.

public static void main(String[] args) {
    
    
    test1();
}

public static void test1 () {
    
    
    // 间接递归, 方法内部调用其他方法, 其他方法再调用此方法
    test2();
}

private static void test2() {
    
    
    test1();
}

¿ Problemas con la recursividad ?

Si la recursividad no se controla y finaliza, habrá un bucle infinito recursivo, lo que provocará un desbordamiento de la memoria de la pila.

algoritmo común recursivo

Guía de casos recursivos: calcule el factorial de 1-n :

necesitar:

  • Calcule el resultado del factorial de 1-n y use el pensamiento recursivo para resolverlo. Primero comprendamos el proceso y los puntos centrales de la recursividad desde la perspectiva del pensamiento matemático.

analizar:

  • Transforme un problema complejo capa por capa en un problema de menor escala similar al problema original a resolver.

  • Si pensamos que existe una fórmula f(n) = 1 2 3 4 5 6 7*…(n-1)*n;

  • Entonces la forma equivalente de la fórmula es: f(n) = f(n-1) *n

  • Si estamos buscando el resultado del factorial de 1-5, ¿cómo debemos aplicar manualmente la fórmula anterior para calcular:

  • f(5) = f(4) * 5
    f(4) = f(3) * 4
    f(3) = f(2) * 3
    f(2) = f(1) * 2
    f(1) = 1

  • Salir de la recursividad como condición cuando f(1)

código de muestra :

public static void main(String[] args) {
    
    
    System.out.println(f(5));
}

public static int f(int num) {
    
    
    if (num == 1) {
    
    
        return 1;
    } else {
    
    
        return num * f(num - 1);
    }
}

Estudio de caso recursivo: calcule la suma de 1-n

necesitar:

  • Calcule el resultado de la suma de 1-n y use el pensamiento recursivo para resolverlo. Primero comprendamos el proceso recursivo y los puntos centrales del pensamiento matemático.

analizar:

  • Supongamos que pensamos que existe una fórmula f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + ...(n-1) + n;

  • Entonces la forma equivalente de la fórmula es: f(n) = f(n-1) + n

  • Punto final de la recursividad: f(1) = 1

  • Si está buscando el resultado de la suma de 1-5, ¿cómo debe calcularlo?

  • f(5) = f(4) + 5
    f(4) = f(3) + 4
    f(3) = f(2) + 3
    f(2) = f(1) + 2
    f(1) = 1

código de muestra :

public static void main(String[] args) {
    
    
    System.out.println(sum(100));
}

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

Estudio de caso: problema del mono comiendo melocotón :

El mono recogió algunos duraznos el primer día e inmediatamente se comió la mitad. Sintió que los duraznos no eran suficientes, así que se comió otro. Todos los días, comí la mitad de los duraznos restantes de anteayer. Sentí que no era suficiente, así que comí uno más; al décimo día, descubrí que solo había un durazno.

necesitar:

  • ¿Puedo preguntar cuántos duraznos recogió el mono el primer día?

analizar:

  • En general, el mismo evento se realiza todos los días, un problema típico de regularización, considerando los tres elementos de la recursividad:

  • Fórmula recursiva ( por ejemplo, el número total de melocotones en el primer día está representado por f(n), y f(n+1) representa el segundo día ):

    f(n) - f(n)/2 - 1 = f(n+1)La deformación se puede obtener:f(n)= 2f(n+1) + 2

  • Punto final de recurrencia: f(10) = 1

Dificultad: Usar ideas matemáticas para derivar fórmulas recursivas

código de muestra :

public static void main(String[] args) {
    
    
    System.out.println(foo(1));
}

public static int foo(int n) {
    
    
    if (n == 10) {
    
    
        return 1;
    } else {
    
    
        return 2 * foo(n + 1) + 2;
    }
}

Caso de recursividad irregular

En los casos anteriores, todos los algoritmos recursivos están dirigidos a problemas recursivos con regularización.

Hay muchos problemas que son irregularmente recursivos, como la búsqueda de archivos. ¿Cómo resolver?

  • Los problemas recursivos irregulares pueden ser resueltos por usted mismo, lo que requiere un pensamiento de programación orientado al proceso.

Estudio de caso-búsqueda de documentos :

necesitar:

  • Desde una determinada ruta en la computadora, busque un determinado nombre de archivo y genere la ruta absoluta.

analizar:

  • El primero en localizar debe ser el objeto de archivo de primer nivel
  • Recorra todos los objetos de archivo de primer nivel para determinar si son archivos
  • Si es un archivo, juzga si es lo que quieres
  • Si es una carpeta, debe continuar recursivamente y repetir el proceso anterior

código de muestra :

public class RecursionDemo5 {
    
    
    public static void main(String[] args) {
    
    
        findFile("demo2.txt", new File("/Users/chenyq/Documents/file_test"));
    }

    /**
     * @param name 搜索的文件名
     * @param dir 搜索的目录
     * @return
     */
    public static void findFile(String name, File dir) {
    
    
        // 判断目录是否为空
        if (dir != null && dir.isDirectory()) {
    
    
            // 获取目录下的一级文件数组
            File[] files = dir.listFiles();
            // 判断数组是否有内容
            if (files != null && files.length > 0) {
    
    
                // 不为空则遍历数组
                for (File file : files) {
    
    
                    // 判断是文件还是文件夹
                    if (file.isFile()) {
    
    
                        // 判断当前文件是否是要查找的文件
                        if (file.getName().contains(name)) {
    
    
                            System.out.println("文件路径是: " + file.getAbsolutePath());
                            return;
                        }
                    } else {
    
    
                      	// 递归查找子目录
                        findFile(name, file);
                    }
                }
            }
        } else {
    
    
            System.out.println("请输入正确的目录!");
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/m0_71485750/article/details/127581711
Recomendado
Clasificación