[Lenguaje C] Explicación detallada del problema de la Torre de Hanoi (función recursiva en lenguaje C)

Introducción al problema y antecedentes.

Torre de Hanoi, también conocida como la Torre de Hanoi. Es un juguete educativo procedente de antiguas leyendas indias. Cuando Brahma creó el mundo, hizo tres pilares de diamantes. En un pilar, había 64 discos de oro apilados en orden de tamaño. Brahma ordenó a Brahmin que reorganizara los discos en otro pilar en orden de tamaño de abajo hacia arriba. También se estipula que el disco no se puede agrandar en el disco pequeño y solo se puede mover un disco entre los tres pilares a la vez.
¡A continuación, analizaremos las ideas específicas del problema de la Torre de Hanoi!

Ilustración de la Torre de Hanoi en movimiento

norte=3

Insertar descripción de la imagen aquí

Se puede entender aquí que primero ponemos lo anterior.n-1Los dos discos se mueven al pilar B con la ayuda del pilar C, luego el disco más grande se mueve al pilar C y luego se ejecuta la misma idea.

norte=4

Insertar descripción de la imagen aquí
cuandonorte=4, aún podemos poner primero lo anteriorn-1un disco (aquí es decirprimeros tres discos) Intente colocarlo en el pilar B (la operación específica se explicará más adelante) y luego coloque el disco más grande en el pilar C. Después de hacer esto,Trate el disco más grande como fijoy obtuve la sumanorte=3Una situación similar se muestra en la figura anterior. Las transferencias posteriores son fácilesnorte=3mismo.

Análisis de problemas e implementación de código.

Primer método de movimiento de disco n-1

Premisa: Hay n discos dispuestos en el pilar A en orden de pequeño a grande. Hay tres pilares. Marcamos estos tres pilares como A, B y C respectivamente.
1.Cuando n es un número par, mueva el disco más pequeño en el orden A->B->C->A, muévete una vez;Cuando n es un número impar, mueva el disco más pequeño en el orden A->C->B->A, muévase una vez
2. Luego, mueva los discos móviles de los otros dos pilares al nuevo pilar.Es decir, mueva el disco del pilar no vacío al pilar vacío. Cuando ambos pilares no estén vacíos, mueva el disco más pequeño., muévete una vez. Aunque este paso no especifica claramente qué disco mover, la acción realizada es única.
3. Repetir las operaciones 1 y 2, y finalmente completar el movimiento de la Torre de Hanoi.

Número de movimientos

Orden Número de movimientos ley
1 1 2^1-1
2 3 2^2–1
3 7 2^3-1
4 15 2^4-1
norte \ 2^n-1

Si nos moveremos antesn-1Según la Hanoi(n-1)conclusión anterior, el número de movimientos de n discos se puede Hanoi(n)=2*Hanoi(n-1)-1calcular usando (n>0).

código fuente

int Hanoi(int n)
{
    
    
	if (n > 0)
		return 2 * Hanoi(n - 1);
	else
		return 1;
}
int main()
{
    
    
	int n = 0;
	printf("圆盘的个数:>");
	scanf("%d", &n);
	int ret = Hanoi(n) - 1;
	printf("%d\n", ret);
	return 0;
}

Insertar descripción de la imagen aquí

Impresión por pasos móvil

Para imprimir los pasos en movimiento en código, debemos comprender todo el proceso. De hecho, hay un bucle en el movimiento de la Torre de Hanoi:Cuando n es un número par, siempre se repite con A->B, A->C, B->C, A->B, C->A, C->B; cuando n es un número impar, siempre bucles con bucle A ->C,A->B,C->B,A->C,B->A,B->C.
La implementación del código específico es la siguiente.

#include<stdio.h>
#include<windows.h>
int count;
void Move(int n, char a, char b)
{
    
    
    count++;
    Sleep(1000);
    printf("第%2d次移动 Move %d: %c -> %c \n", count, n, a, b);
}
void Hanoi(int n, char a, char b, char c)
{
    
    
    if (n == 1)
    {
    
    
        Move(n, a, c);
    }
    else
    {
    
    
        Hanoi(n - 1, a, c, b);
        Move(n, a, c);
        Hanoi(n - 1, b, a, c);
    }
}

int main()
{
    
    
    int n = 0;
    printf("汉诺塔的层数:>");
    scanf(" %d", &n);
    Hanoi(n, 'A', 'B', 'C');
    return 0;
}

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/2301_77404033/article/details/132132051
Recomendado
Clasificación