汉诺塔——递归

摘要:
河内塔,又称河内塔,起源于一个古老的印度传说。当婆罗门创造世界时,他制作了三个钻石柱,上面从下到上按大小排列着64个金盘。婆罗门命令婆罗门将圆盘从下按大小重新排列在另一根柱子上。然后回溯参数2。首先执行输出语句,然后在输出语句之后执行函数。2减1遇到递归退出。此时,递归过程结束。

汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
假如有三根柱子:

1、过程分析:

(1)当只有两个盘子的时候(移动两次):

a--b

a--c

b--c

(2)当有三个盘子的时候:

应该考虑将最上层的两个较小的盘子先从a移动到b,然后将a上的最大的盘子(最底层)移动到c。

将最上层的盘子移到c;

中间的盘子移到b;

再将第一步的c上的盘子移动到b;

至此,最上层的两个盘子已经成功的移动到了b。

现在,需要将a柱子上的最下层的盘子移动到c柱子上。

然后再将a柱子作为辅助位,b柱子作为起点,c柱子作为终点,将b上的两个盘子移动到c即可。

......

(3)当有n个盘子的时候,需要先将c柱子作为辅助位,a为起始位,b为终点。将上面的n-1个盘子从a移动到b。

然后将最下层的盘子从a移动到c。

最后将b上面的n-1个盘子从b移动到c。

 2、代码实现:

#include<stdio.h>
void hanoi(int n,char A,char B,char C){//n代表  a柱子上面的盘子数量 
    if(n==1){
        printf("%c->%c
",A,C);//如果只有一个盘子,直接从  A 移动到  C 
    }else{
        hanoi(n-1,A,C,B);//将 n-1个盘子从  A 移动到  B 
        printf("%c->%c
",A,C);
        hanoi(n-1,B,A,C); //将 n-1个盘子从 B 移动到  C 
    } 
} 
main(){
    hanoi(3,'A','B','C') ;
} 

运行结果:

以a上面初始为3个盘子:

汉诺塔——递归第1张

 3、递归算法过程分析:

汉诺塔——递归第2张

分解过程:在有三个盘子的情况下,先对函数执行分解过程,直到分解到参数为1的时候达到递归出口。

回溯过程:从参数为1开始向上回溯,参数为2的时候先执行输出语句,然后执行输出语句下面的一句,执行后又遇到递归出口(即参数为1)。

                  当回溯到参数为3的时候,先执行输出语句,再执行输出语句后参数为2的情况,需要再次进行分解操作,然后参数为1,到递归出口。然后对参数为2进行回溯,先执行输出语句,再执行输出语句后的函数,2减1遇到递归出口,至此,递归过程结束。

免责声明:文章转载自《汉诺塔——递归》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DevExpress WPF让创建绑定到数据的3D图表控件变得更容易(Part 1)alpha项目展示下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

无废话JavaScript(下)

无废话JavaScript(下)上一篇在这里,在这里,在这里……五、函数式这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们。其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实现方案。由于它的基础思想与命令式——如果你不想用这个难于理解的名词,那就把它换成C,或者Delph...

Java 查询数据后进行递归操作

java的递归方法记录: private List<Map<String, Object>> generateOrgMapToTree(List<Map<String, Object>>orgMaps, Integer pid) { if (null == orgMaps || orgMaps...

【转】递归函数时间复杂度分析

(1) 递归执行过程    例子:求N!。     这是一个简单的"累乘"问题,用递归算法也能解决。     n! = n * (n - 1)!   n > 1     0! = 1, 1! = 1      n = 0,1     因此,递归算法如下:    Java代码 fact(int n) {      if(n == 0 || n == 1...

python- 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化

1.双层装饰器 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # author:zml LOGIN_INFO=False IS_ADMIN=False defcheck_log(func): definner(): res=func() ifLOGIN_INFO: print('验证成功!') return...

递归实现阶乘

如果想实现一个阶乘,比如6 * 5 * 4 * 3 * 2 * 1,首先想到的可能是循环遍历。如下: class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数");...

python基础练习题(题目 递归输出)

day19 --------------------------------------------------------------- 实例027:递归输出 题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 分析:相反顺序可以用列表来,直接pop方法。 1 def reverseprint(a): 2 lit = list(...