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;
}
運作結果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLyIjM4IDNxMjMwIzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
現在個源代碼加入注釋
#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 (與上述推測過程的是一樣的)
請按任意鍵繼續. . .
*/