開始學習C語言遞歸程序,漢諾(hanoi)塔問題嘗試
阿新 • • 發佈:2018-10-17
nbsp amp pri 現在 轉移 思考 大小 urn double
{
double result;
if(n == 1)
result = 1;
else
result = 2 * hanio(n - 1) + 1;
return result;
}
漢諾問題:3個座A, B,C, 在A座有64個大小不等的盤,現在要把64個盤轉移到另一個座,每次只能移動一個盤,且大盤不能放在小盤上面。
思考過程。
1)移動1個盤到另一個座需要搬1次,記
a(1) = 1
2)移動2個盤:在已經移動1個盤的基礎上(用a1次),將第2個盤放到另一個空座(1次),然後再將第1個盤移動到第2個盤上,需要a1次,記
a(2) = 2 * a(1) + 1
3)移動3個盤:在已經移動2個盤的基礎上(用a2次),將第3個盤放到另一個空座(1次),然後再將前2個盤移動到第3個盤上,需要a2次,記
a(3) = 2 * a(2) + 1
。。。。。。
a(n) = 2 * a(n - 1) + 1
規律很明顯,但貌似不符合遞歸的思維方式。
但是先按遞歸程序的寫法練一下再說。。。
#include <stdio.h>
#include <math.h>
double hanio(int n);
int main(void)
{
int n;
double m;
printf("Enter n:");
scanf("%d", &n);
printf("%.0f\n", hanio(n));
m = pow(2, n) - 1;
printf("%.0f\n", m);
return 0;
}
double hanio(int n)
{
double result;
if(n == 1)
result = 1;
else
result = 2 * hanio(n - 1) + 1;
return result;
}
此處用公式m = pow(2, n) - 1來驗證結果的正確性。
運行,
Enter n:64
18446744073709551616
18446744073709551616
完成。
開始學習C語言遞歸程序,漢諾(hanoi)塔問題嘗試