De la recursividad a la Torre de Hanoi

La recursividad, como todo el mundo sabe, el famoso número de Fibonacci es un ejemplo clásico de este punto de conocimiento.
Hoy, echemos un vistazo al problema recursivo más clásico Tower of Hanoi y Frog Jumping Steps , pero este es en realidad un problema matemático. Primero echemos un vistazo a la Torre de Hanoi.

Torre de Hanoi

El matemático francés Edward Lucas escribió una vez una antigua leyenda india: En el templo sagrado de Benarés (en el norte de la India) en el centro del mundo, se insertan tres agujas de gemas en una placa de latón. Cuando el dios principal del hinduismo, Brahma, creó el mundo, llevaba 64 piezas de oro de mayor a menor en una de las agujas, la llamada Torre de Hanoi. No importa de día o de noche, siempre hay un monje moviendo estas piezas de oro de acuerdo con la siguiente regla: solo una pieza a la vez, sin importar en qué aguja esté puesta, la pieza pequeña debe estar encima de la pieza grande. Los monjes predijeron que cuando todas las piezas de oro fueran movidas de la aguja usada por Brahma a otra aguja, el mundo sería aniquilado con un rayo, y la pagoda, los templos y los seres sintientes perecerían.

Esta leyenda es bastante interesante, esta leyenda dice que hay 64 piezas de oro. Pero vamos a discutir si solo hay 3 o 4 lentejuelas. Eche un vistazo al mapa de la red.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Comenzamos la discusión con tres piezas. Al comienzo del tema de discusión, comprenda que la posición de esta columna no afecta el movimiento, pero la columna específica es la clave.
Veamos cuántas veces hay que mover si solo hay una lentejuela.

Inserte la descripción de la imagen aquí
Obviamente, una sola vez es suficiente.
Echemos un vistazo a dos piezas de oro.
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Ya que tenemos que mover todo al pilar C

1:
a: A-> B
2:
b: A-> C
3;
a: B-> C

Puede moverse por todas partes en tres pasos.
O si desea mover el segmento b, primero debe mover el segmento a, dejando el pilar C vacío para el segmento b para considerar el movimiento del segmento a.
Echemos un vistazo al movimiento de las tres piezas,
Inserte la descripción de la imagen aquí
luego de acuerdo con la idea anterior, si quieres mover la pieza c, primero debes mover las piezas ayb, dejando el pilar C a la pieza c.
Esta condición debe cumplirse primero,
Inserte la descripción de la imagen aquí
y lo grande no puede estar por encima de lo pequeño. Primero debe moverse así.
Inserte la descripción de la imagen aquí
Y, si quiere estar satisfecho con esta apariencia, primero.
Inserte la descripción de la imagen aquí
En conclusión,

primer paso

Inserte la descripción de la imagen aquí

Segundo paso

Inserte la descripción de la imagen aquí

tercer paso

Inserte la descripción de la imagen aquí
Mirándolo de esta manera, no es diferente de la discusión anterior que solo movió dos piezas.
Luego mueva el corte c a la columna C.
Inserte la descripción de la imagen aquí
Se volvió así. Echemos un vistazo de nuevo, como dije al principio del artículo, la posición de la columna no es crítica, la posición se puede cambiar, pero se debe mover a una columna específica. Ahora parece que, ¿fuimos a mover las dos lentejuelas antes?
Inserte la descripción de la imagen aquí
Vea claramente, esto se parece a los pasos de mover dos lentejuelas. Luego siga los pasos anteriores y estará bien.
Calculemos los pasos de escritura

La primera parte:
mueve dos lentejuelas al pilar B.
La segunda parte:
mueve la pieza C al pilar C. La
tercera parte:
mueve las dos lentejuelas al pilar C.

Para resumir
, los pasos de mover dos lentejuelas, mover dos veces y luego mover la lentejuela inferior nuevamente. Un total de 2 * 3 + 1 == 7 veces.

Veamos los pasos de las cuatro lentejuelas.

Si quieres mover estas cuatro lentejuelas, debes mover la lentejuela inferior

Inserte la descripción de la imagen aquí
Mirándolo de esta manera, hay dos partes.

Uno:
Mueva la pieza d a la columna C.
Dos:
Mueva las tres piezas de oro abc a la columna C.

Analogía con mover tres piezas arriba,

Primer propósito

Inserte la descripción de la imagen aquí

Segundo propósito

Inserte la descripción de la imagen aquí

Tercer propósito

Inserte la descripción de la imagen aquí
Se puede realizar en tres partes. Puede verse que el método de movimiento de tres piezas debe moverse dos veces.
Eso es 2 * 7 + 1 == 15 veces.
**

Así sucesivamente

**
Cuando mueva N piezas de lentejuelas, primero considere,
una -> mueva las N-1 piezas de lentejuelas.
Dos -> mueve la rebanada N de nuevo,
tres -> mueve la rebanada N-1 al destino nuevamente.
Se puede dividir en tres pasos.
La posición del pilar no tiene ningún efecto sobre el movimiento.
Mira el código, este es el código para contar el número de veces.

#include <stdio.h>
int hanoi(int n)
{
    
    
	if (n >= 2)
		return 2 * hanoi(n - 1) + 1;
	return 1;
}
int main(void)
{
    
    
	printf("Problem of Hanoi\n");
	printf("please input the number for problem:>\n");
	int n;
	scanf("%d", &n);
	printf("%d",hanoi(n));
	return 0;
}

Este es el código para el paso de compilación.

#include <stdio.h>
void move(char start,char end,int n)
{
    
    
	static int count = 0;
	count++;
	printf("NO.%d step,the %d moves from %c to %c\n", count, n, start, end);
}
void hanoi(int n,char pose1,char pose2,char pose3)
{
    
    
	if (n == 1)
		move(pose1, pose3, 1);//一个是特例,不存在中间位置
	else
	{
    
    
		hanoi(n - 1, pose1, pose3, pose2);//对应第一次移动N-1个金片
		move(pose1, pose3, n);//对应移动第N个金片
		hanoi(n - 1, pose2, pose1, pose3);//最后一次移动N-1个金片
	}
}
int main(void)
{
    
    
	
	char pose1 = 'A';//起始位置
	char pose2 = 'B';//中间位置
	char pose3 = 'C';//结束位置
	int n;
	scanf("%d", &n);
	hanoi(n, pose1, pose2, pose3);
	
	return 0;
}

Cuando utilice la recursividad, considérelo como un módulo funcional , en lugar de analizarlo paso a paso. Utilice su función para determinar la condición de terminación y abordar esta condición al mismo tiempo.
Usando funciones de escritura recursiva, los cálculos pueden ser "fáciles".
Solo para profundizar su propia comprensión, sea como un estudiante, no se ría.
Si tienes alguna pregunta, por favor dame un consejo.

Supongo que te gusta

Origin blog.csdn.net/weixin_52199109/article/details/113003580
Recomendado
Clasificación