C++/python解决汉诺塔问题

今天学习python的时候,恰好慕课上的老师给出的例子是汉诺塔问题。之前也看过汉诺塔的代码,给我的感觉就是...移来移去好乱啊

恰好一天没课,打算把这个问题搞清楚,先用C++去实现吧,给出代码

#include<iostream>

using namespace std;

void Move(char a, char b, char c, int n){
    if(n==1){
        cout << "从" << a << "移动至" << c <<endl;
        return;
    }
    else
        Move(a, c, b, n-1);
        Move(a, b, c, 1);
        Move(b, a, c, n-1);
}

int main(){

    int n;

    cout << "请输入汉诺塔盘数!" <<endl;
    cin >> n;

    Move('a', 'b', 'c', n);

    return 0;
}

我详细的解释一下每句代码的作用

首先,汉诺塔问题有三支杆和若干盘子,我们从左到右取名a,b,c杆

除了主函数,我还定义了Move函数,4个参数的意义分别是:出发杆,中途‘休息’杆,目的杆,出发杆上的盘数

首先,从主函数开始看,在获取盘子数后,我们的目的便是将这n个盘子从a(汉诺塔问题默认的出发杆)运到c(目的杆),从总体来看,b杆为中途‘休息’杆

所有递归函数都要有终止条件,当出发杆上只有一个盘的时候,这个问题便不能往下分解了(这个盘肯定只能从出发杆移到目的杆)。

那当出发杆上不止一个盘的时候,比如说,四阶汉诺塔,这时候就需要【1】先将上面三个小盘移到中途休息杆(这里是b)【2】将最大的盘从出发杆(这里是a)移到目的杆(这里是c)【3】将上面三个小盘从中途休息杆(这里是b)移到目的杆(这里是c)

而上面第(1)步的实现,其实就是个三阶汉诺塔,只不过出发杆变成了b,中途休息杆变成了a,目的杆变成了c

当然,在没有分解成一阶汉诺塔之前,会继续分解成低阶汉诺塔的


然后又用python写了一遍

def Move(a, b, c, n):
    if n==1:
        print 'move %c to %c'  %(a, c)
        return
    else:
        Move(a, c, b, n-1);
        Move(a, b, c, 1);
        Move(b, a, c, n-1);
        
n=input('please input n:');
Move('a', 'b', 'c', n);

感觉用python写有一种暗爽,或许是不用声明变量类型 大笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值