欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))

发布时间:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一)) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。

操作规则:

每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

思路:

图解:

示例:

当有两个盘a,b时

示例:

当有三个盘a,b,c时

算法分析(递归算法):

实现这个算法可以简单分为三个步骤:

(1) 把n-1个盘子由A 移到 B;

(2) 把第n个盘子由 A移到 C;

(3) 把n-1个盘子由B 移到 C;

从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:

(1)中间的一步是把最大的一个盘子由A移到C上去;

(2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,

(3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上

递归的代码实现

```#include

void hanoi(int n, char source, char goal, char temp)

{

if (n == 1)

{

printf("Move %d :from %c to %c\n", n, source, goal); //将第n个盘子从source移动到goal

}

else

{

hanoi(n - 1, source, goal, temp);

//将n-1个盘子借助goal从source移动到temp

printf("Move %d :from %c to %c\n", n, source, goal);

//将第n个盘子从source移动到goal

hanoi(n - 1, temp, goal, source);

//将n-1个盘子借助source从temp移动到goal

}

}

int main()

{

int n = 0;

printf("请输入盘子的个数:");

scanf("%d", &n);

hanoi(n, 'A', 'B', 'C');//借助B杆将A中盘移动到C上

return 0;

}```

总结

以上是生活随笔为你收集整理的c语言递归汉诺塔次数,汉诺塔问题(C语言经典递归问题(一))的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。