Estructura de datos --- recursividad

Recursividad

La importancia de la recursividad para la programación

  • La recursividad es un salto cualitativo para tu capacidad de codificación. Si quieres convertirte en un programador muy poderoso, debes dominar la estructura de datos . Las computadoras son especialmente adecuadas para resolver problemas con el pensamiento recursivo, pero los humanos usamos el pensamiento recursivo para considerar El problema será muy problemático, ¡y esto es lo que muchas personas que han estudiado la recursividad nunca han entendido! La idea de recursividad es una de las ideas básicas del pensamiento del software . En la teoría de árboles y grafos , casi todos se realizan por recursividad. El problema más simple, como encontrar el factorial, que no tiene un número claro de ejecuciones, se resuelve mediante recursividad.

Definición de recursividad

  • Una función se llama a sí misma directa o indirectamente (una función que llama a otra función es exactamente lo mismo que cuando se llama a sí misma, son los tres pasos, pero es un poco extraño a los ojos de la gente).

Explicación detallada de las llamadas a funciones

Al llamar a otra función durante la ejecución de una función, el sistema necesita completar tres cosas antes de ejecutar la función llamada:

  1. Pase todos los parámetros reales, la dirección de retorno y otra información a la función llamada para guardar;
  2. Asignar espacio de almacenamiento para las variables locales (incluidos los parámetros formales) de la función llamada;
  3. Transferir el control a la entrada de la función llamada.

Antes de regresar de la función llamada a la función que llama , el sistema debe completar tres cosas:

  1. Guarde el resultado de retorno de la función llamada;
  2. Liberar el espacio de almacenamiento ocupado por la función llamada;
  3. Transfiera el control a la función de llamada de acuerdo con la dirección de retorno guardada por la función llamada.

Cuando hay múltiples funciones llamándose entre sí, de acuerdo con el principio de " " después de que la llamada regresa "", la transferencia de información y la transferencia de control entre las funciones anteriores deben realizarse con la "" pila " ", es decir, el sistema necesita ejecutar el programa completo El espacio de datos se organiza en una pila. Siempre que se llama a una función, se asigna un área de almacenamiento en la parte superior de la pila y se realiza la operación de pila . Siempre que una función sale, se libera su área de almacenamiento y se realiza la operación de pila . La operación actual La función siempre está en la parte superior de la pila.

Una función llama a una función y una función A llama a la función B en la computadora, no hay diferencia, ¡pero es extraño entenderlo en nuestra forma diaria de pensar!

Tres condiciones satisfechas de forma recursiva

  1. La recursividad debe tener una condición de terminación clara
  2. La escala de datos procesados ​​por esta función debe estar disminuyendo
  3. Esta transformación debe tener solución

Comparación de bucle y recursividad

Recursión:

  • Fácil de entender
  • Lento
  • Gran espacio de almacenamiento

ciclo:

  • No es fácil de entender
  • alta velocidad
  • Poco espacio de almacenamiento

Teóricamente, lo que puede resolverse mediante un ciclo definitivamente se puede transformar en recursividad, pero este proceso es un proceso de transformación matemático complejo. La recursividad no se puede resolver necesariamente en un ciclo. Si tienes la capacidad de usarlo depende de la persona.

Resuelva el problema de la torre de Hanoi con recursividad

Inserte la descripción de la imagen aquí
Pseudo algoritmo:

if(n > 1)
{
    
    
	//先把A柱子上的前n-1个盘子从A借助C移动B
	//将A柱子上的第n个盘子直接移到C
	//再讲B柱子上的n-1个盘子借助A移到C
}

Implementación:

#include <stdio.h>
#include <stdlib.h>

void hannuota(int n,char A,char B,char C)
{
    
    
/*如果是一个盘子,直接从A柱子上的盘子从A移到C
否则,将A柱子上的n-1个盘子借助C移到B.直接将A柱子上的盘子从A移到C,
最后将B柱子上的n-1个盘子借助A移到C*/

    if(1 == n)
        printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
    else
    {
    
    
        hannuota(n-1,A,C,B);
        printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
        hannuota(n-1,B,A,C);
    }
}

int main()
{
    
    
    char ch1 = 'A';
    char ch2 = 'B';
    char ch3 = 'C';
    int n;

    printf("请输入盘子的个数:");
    scanf("%d",&n);

    hannuota(n,'A','B','C');

    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_41782149/article/details/92843197
Recomendado
Clasificación