码迷,mamicode.com
首页 > 其他好文 > 详细

递归解决汉诺塔问题

时间:2019-01-11 20:09:41      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:i+1   循环   一个   不同   move   name   ++   不能   +=   

汉诺塔问题:有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,求至少需要多少次移动。

 

我们首先假设n=1,那么move(n)=1,因为这时候只需要从A->C便可以。接下来假设n=2,那么move(n)=3 即A->B,A->C,B->C; 假设n=3,move(n)=7 即A->C,A->b,C->B,A->C,B->A,B->C,A->C ,我们可以把move(n)看作是把n个盘子移动到某个柱子上,于是move(n)=move(n-1)+1+move(n-1),代表的意思便是将n-1个盘子搬到B,再将最底下最大的盘子搬到C,然后再将n-1个盘子搬回到C,达到目的。递归的终止条件当然就是move(1)=1{这是为了保证n=1的时候可以终止}以及move(2)=3

 

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int sum = 0;
 6 
 7 void Hanoi(char from,char by,char to,int n)
 8 {
 9     // 根据题目是否需要打印路径 cout << from << " move to " << to << " by " << by << endl;
10     if(n==1)
11     {
12         sum++;
13         return;
14     }
15     else if(n==2)
16     {
17         sum+=3;
18         return;
19     }
20     Hanoi(from,to,by,n-1);
21     sum++;
22     Hanoi(by,from,to,n-1);
23 }
24 
25 int main()
26 {
27     Hanoi(A,B,C,3);
28     return 0;
29 }

如果不需要打印路径只要求次数的话,次数的递推式便是move(n)=(n==1?1:(move(n-1)*2+1)) (也就是循环2*i+1)

递归解决汉诺塔问题

标签:i+1   循环   一个   不同   move   name   ++   不能   +=   

原文地址:https://www.cnblogs.com/kachunyippp/p/10256787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!