天天看點

通過hanoi塔問題了解遞歸

hanoi塔問題的遞歸實作的代碼

#include <stdio.h>
#include <stdlib.h>
void hanoi(int n, char A, char B, char C)
{											
	//printf("n = %d\n", n);
	if(n == 1)						
		printf("%c -> %c\n", A, C);
	else
	{
		hanoi(n - 1, A, C, B);		
		printf("%c -> %c\n", A, C);
		hanoi(n - 1, B, A, C);		
	}
}

int main()
{
	hanoi(3, 'A', 'B', 'C');
	system("pause");
	return 0;
}
           

運作結果

通過hanoi塔問題了解遞歸

現在個源代碼加入注釋

#include <stdio.h>
#include <stdlib.h>
void hanoi(int n, char A, char B, char C)	//hanoi塔問題, 每結束一個hanoi()函數,
{											//都會把A上的n個盤子全部移到C上		**********	這是函數的功能!!!!!
	printf("n = %d\n", n);
	if(n == 1)						//把A上一個盤子移到C上 ************** 2
		printf("%c -> %c\n", A, C);
	else
	{
		hanoi(n - 1, A, C, B);		//把A上n - 1個盤子移到B上	********* 1
		printf("%c -> %c\n", A, C);
		hanoi(n - 1, B, A, C);		//再把B上n - 1個盤子移到c上 ********* 3
	}
}
//******************   注意函數有兩個printf(), 但隻會執行一個	輸出的都是函數的	A -> C	(注意參數類型)
int main()
{
	hanoi(3, 'A', 'B', 'C');
	system("pause");
	return 0;
}
/*
	遞歸函數實作過程
	hanio(3, A, B, C) ------------------------------------- n == 3
		hanio(2, A, C, B) --------------------------------- n == 2
			hanio(1, A, C, B) ----------------------------- n == 1
				printf();
			printf();
			hanio(1, B, A, C) ----------------------------- n == 1
				printf();
		printf();
		hanio(2, B, A, C) --------------------------------- n == 2
			hanio(1, A, C ,B) ----------------------------- n == 1
				printf();
			printf();
			hanio(1, B, A, C) ----------------------------- n == 1
				printf();
	函數結束
	驗證: 注意n值的變化:3 2 1 1 2 1 1
	在函數執行判斷是輸出n的值
output:
n = 3
n = 2
n = 1
A -> C
A -> B
n = 1
C -> B
A -> C
n = 2
n = 1
B -> A
B -> C
n = 1
A -> C
n 的順序為 3 2 1 1 2 1 1	(與上述推測過程的是一樣的)
請按任意鍵繼續. . .
*/