递归-汉诺塔

解题步骤:

第一步:

把n-1个模块 从塔 A 移动到塔 B

把第n个模块 从塔 A 移动到塔 C

第二步

把n-1个模块 从塔 B 移动到塔 C

代码:

#include<bits/stdc++.h>

using namespace std;

void hannoi(int n, char A, char B, char C)// 把A盘里面的圆圈转移到C盘里面【A--C】。
{
    if (n == 1)
    {
        cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;//把最后一个圆环从起点盘移动到目标盘。
    }
    else
    {
        hannoi(n - 1, A, C, B);// 把N-1个圆环从起点盘移动到(当前)没有任何圆环的过度盘;通过B、C盘在此函数调用中调用位置的互换,来实现把N-1个圆环从A盘到B盘的转移【A--B】。
        cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;//把第n个盘从A移动到C
        hannoi(n - 1, B, A, C);// 把N-1个圆环从国度盘移动到目标盘(模仿1和2的操作方法来实现);通过A、B盘在此函数调用中位置的互换,来实现N-1个圆环从B盘到C盘的转移【B--C】。
    }
}

int main()
{
    int n;
    cin >> n;
    hannoi(n, 'a', 'b', 'c');
    system("pause");
    return 0;
}

NUST2009-6改:汉诺塔盘子每移动一步需要一秒,输入盘子数n,输出每一步的操作以及共需要多少年,多少天,多少小时,多少分钟,多少秒完成。

#include<bits/stdc++.h>

using namespace std;

static int sum = 0;

void hannoi(int n, char A, char B, char C)// 把A盘里面的圆圈转移到C盘里面【A--C】。
{
    
        if (n == 1)
        {
            sum++;
            cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;//把最后一个圆环从起点盘移动到目标盘。
        }
        else
        {
            hannoi(n - 1, A, C, B);// 把N-1个圆环从起点盘移动到(当前)没有任何圆环的过度盘;通过B、C盘在此函数调用中调用位置的互换,来实现把N-1个圆环从A盘到B盘的转移【A--B】。
            sum++;
            cout << "移动圆圈" << n << "从盘" << A << "到盘" << C << endl;
            hannoi(n - 1, B, A, C);// 把N-1个圆环从国度盘移动到目标盘(模仿1和2的操作方法来实现);通过A、B盘在此函数调用中位置的互换,来实现N-1个圆环从B盘到C盘的转移【B--C】。
        }
    
}

int main()
{
    int n;
    int year, day, hour, mins, second;
    cin >> n;
    hannoi(n, 'a', 'b', 'c');
    year = sum / (365 * 24 * 3600);//求年
    sum = sum - 365 * 24 * 3600 * year;//剩余秒数
    day = sum / 86400;//求天数,一天3600*24=86400秒
    sum = sum - 86400 * day;//剩余秒数
    hour = sum / 3600;//求小时
    sum = sum - 3600 * hour;//剩余秒数
    mins = sum / 60;//求分钟
    second = sum - 60 * mins;//秒数
    cout << endl << "用时:" << year << "年" << day << "天" << hour << "小时" << mins << "分钟" << second << "秒" << endl;
    
    return 0;
}

 问题与总结

1.错误 1 error C2872: “count”: 不明确的符号

因为没想到是count这个变量命名的原因,所以也没往这方面查。
代码如下,一直提示
错误 1 error C2872: “count”: 不明确的符号
错误 2 error C2872: “count”: 不明确的符号
全局变量命名方式本身没错,错在使用了与命名空间重复的命名std::count,换成sum就完全没问题了。以后千万要注意这个问题。
 

2.递归次数的计算

对于这种计算递归调用次数一定要思路清晰,最好是将所有的递归调用都递归到递归出口的

地方再统一进行递归出口的调用,这样不容易造成紊乱,个人意见,仅供参考。

参考:关于递归次数的计算 - vpoet - 博客园

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值