python用递归函数实现汉诺塔问题_汉诺塔问题的C++和Python的递归实现

递归实现主要使用函数和分支语句,最重要的思想是区分清楚基例和链条两个部分,类似于数学里面的数学归纳法。

C++实现:

#include

using namespace std;

void hanoi(int N,char source,char relay,char destination){//递归函数的定义

if(N==1)//递归终结条件:N==1

cout<"<

else{

hanoi(N-1,source,destination,relay);//先把上面N-1个盘子移到relay

cout<"<

hanoi(N-1,relay,source,destination);

}

}

int main(){

int n;

cout<

cin>>n;

hanoi(n,'A','B','C');//调用递归函数将n个盘子从A转移到C (借助B)

return 0;

}

Python实现:

count = 0

def hanoi(n,src,dst,mid): #将n个圆盘从src借助mid移动到dst

global count #将count声明为全局变量,记录移动的次数

if n==1:

print("{}:{}->{}".format(1,src,dst)) #当只有一个圆盘,从SRC->DST

count+=1

else:

hanoi(n-1,src,mid,dst) #将n-1个圆盘从src借助dst移动到mid

print("{}:{}->{}".format(n,src,dst)) #将第n个圆盘从src移动dst

count+=1

hanoi(n-1,mid,dst,src) #将n-1个圆盘从mid借助src移动到dst

hanoi(6,'A','B','C')

print(count)

实验了一下,当n=4,count=15;n=5,count=31;n=6,count=63……因此移动n个圆盘,需要的次数为2^n-1,即时间复杂度呈现指数式增长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值