开始学习C语言递归程序,汉诺(hanoi)塔问题尝试

汉诺问题: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
完成。

猜你喜欢

转载自www.cnblogs.com/fochive/p/9807017.html