Nueva Solución de la Secuencia de Fibonacci (Programación Dinámica)

Todo el mundo está familiarizado con la sucesión de Fibonacci.

f(n) = f(n-1) + f(n-2)

f(0) = 1

f(1) = 1

Si desea usar un programa de computadora para realizar esta función, es fácil pensar en usar la recursión de acuerdo con la fórmula de recurrencia anterior. La ventaja de usar la recursión es que los programadores no necesitan considerar el proceso de cálculo específico, siempre y cuando encontrar una salida clara para la recursividad.

int fib(int n)
{
    if (n == 0 || n == 1) {
        return 1;
    }

    return fib(n - 1) + fib(n - 2);
}

La desventaja de la recursividad es que implica la sobrecarga de las llamadas a funciones y la eficiencia de ejecución es relativamente baja.

Por supuesto, los métodos iterativos también se pueden usar para resolver el problema. La iteración comienza con la solución del problema conocido y deduce continuamente la solución del problema desconocido. En pocas palabras, la recursividad es un proceso de arriba hacia abajo, y la iteración es un proceso de abajo hacia arriba. .

int fib(int n)
{
    int temp1 = 1;
    int temp2 = 1;
    
    for (int i = 2; i < n; i++) {
        int temp = temp1 + temp2;
        temp1 = temp2;
        temp2 = temp;
    }
    
    return temp1 + temp2;
}

El método iterativo no tiene el proceso de llamarse a sí mismo, por lo que la eficiencia es mucho mayor que la de la recursividad;

Miremos hacia atrás en la implementación de la recursividad. Si quieres resolver fib(5), necesitas obtener fib(4) y fib(3).Para resolver fib(4), necesitas obtener fib(3) y fib (2) Para resolver fib(3) necesitas obtener fib(2) y fib(1), y necesitas obtener fib(1) y fib(0) para resolver fib(2). Resolver fib(3) también necesita pasar por un proceso de este tipo, lo que inevitablemente provocará cálculos repetidos y apilamiento y estallido repetidos de funciones. Si guardamos los resultados resueltos durante el cálculo y los usamos directamente en el cálculo, será mucho más eficiente. Este método se llama programación dinámica.

int fib(int n, int *table)
{
    if (table[n]) {
        return table[n];
    }

    table[n] = fib(n - 1) + fib(n - 2);

    return table[n];
}

int get_value(int n)
{
    int *table = (int *)malloc(sizeof(int) * (n + 1));
    table[0] = 1;
    table[1] = 1;

    return fib(n, table);
}

Supongo que te gusta

Origin blog.csdn.net/daida2008/article/details/100850058
Recomendado
Clasificación