汉诺塔递归

文章介绍了汉诺塔问题的解决思路,通过递归函数moves1和使用栈实现的moves2来计算不同层数的汉诺塔移动次数。移动次数遵循公式N[i]=2*N[i-1]+1。文章以C++代码展示了这两种方法,强调理解递归过程的重要性。
摘要由CSDN通过智能技术生成

先推荐一个很有意思的讲汉诺塔的视频

思路:

背景就不说了

假设汉诺塔有n层,起始时所有圆盘都在A柱,那么为了将所有的圆盘移动到C柱就需要将除最后一个之外的所有的圆盘移到B。
为了将除最后一个之外的所有的圆盘移到B,就需要将除最后两个个之外的所有的圆盘移到C
以此类推。

这篇文章只关注移动次数。

设存在数组N,N[i]的值是i层汉诺塔的移动次数。

非常容易知道N[i]=2*N[i-1]+1(i>1),如果不明白就请思考这句话:为了将所有的圆盘移动到C柱就需要将除最后一个之外的所有A移到B,之后再将所有圆盘移到C。

代码:

#include<iostream>
#include<stack>
#include<cmath>
using namespace std;


//假设汉诺塔有n层,那么为了将所有的圆盘移动到C柱就需要将除最后一个之外的所有的圆盘移到B
//为了将除最后一个之外的所有的圆盘移到B,就需要将除最后两个个之外的所有的圆盘移到C
//以此类推

//递归
int moves1(int layers)
{
    if(layers==1) return 1;
    else
    {
        return 2*moves1(layers-1)+1;
    }
}


//栈 这道题用栈写非常没有意思
int moves2(int layers)
{
    stack<int> S;
    int ans=0;
    for(layers;layers>1;layers--)
         S.push(1);
    ans=1;
    while(!S.empty())
    {
        ans=2*ans+1;
        S.pop();
    }
    return ans;
}

int main()
{
    int layer;
    cout<<"请输入汉诺塔的层数:"<<endl;
    cin>>layer;
    cout<<moves2(layer);
    return 0;
}

我是怎么犯傻的:

聪明如我看到题立刻开始纠结了:它的位置以及中间的细节是什么??浪费了一个下午。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值