汉洛塔是古印度神话产生的智力玩具,他的玩法是,有三个柱子分别为A,B,C,A柱上面有n个盘子上面小下面大堆叠放在一起,现在要求激将A柱上的盘子全部移到C柱上面,并且一次只能移动一个盘子,必须是小盘在大盘的上面。现在要求用C语言递归来完成,并统计递归调用的次数。

这个实现是递归的强大功能的体现,废话不多说,请看源码:

#include<stdio.h>
void move(int n,int *cnt,char A,char B,char C)
{
if(n==1)
{
printf("%d号盘:%c-->%c\n",n,A,C);
//如果还剩一个盘或者只有一个盘时,直接将1号盘移到C柱
(*cnt)++;
//递归调用次数加1
} else
{
move(n-1,cnt,A,C,B);
//将n-1个盘从A柱上借助于C柱移到B柱上
printf("%d号盘:%c-->%c\n",n ,A,C);
//当将n-1个盘移到B柱成功时直接将A柱上的盘移到C柱
move(n-1,cnt,B,A,C);
//再次将n-1个盘从B柱上借助于A柱移到C柱上
(*cnt)++;
//递归调用次数加1
} }
int main(void)
{
int h;
int cnt = 0;
printf("\ninput number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,&cnt,'A','B','C');
printf("一共执行了%d次!\n",cnt);
}

我这里给出的源码是极为精简的,但是很健壮!现在分析如下:

首先,梳理一下思路,要用递归实现的前提是,问题规模更大的解决依赖于问题规模更小的解决,也就是说要想移动n个盘子,必须先移动n-1个盘子,这时递归的基础。那么现在有三个柱子,该如何移动呢?比较好的解决方案是:可以将n-1个盘子以C柱为中转站移动到B柱上,这样A柱上最下面的那个盘子就可自由地移动到C柱上了,然后在将n-1个盘子以A柱为中转站移动到C柱上,这就是上面代码核心的解决算法。

看到这里,很多人又有疑问,感觉这个解决方案,似乎理解了又似乎没理解,这时怎么回事?其实这就是递归的理解问题。在这个问题中,n个盘子会始终按照这个算法执行,当执行到n==1的时候一下子就返回,层层回叠返回最终的结果。

这个里面还有一个有意思的问题,就是递归调用的参数是个变量,比如说

move(n-1,cnt,A,C,B);

这一步中,他将C给了B,B给了C,这是个互换,又因为当n==1的时候不会再递归调用,故当盘子数为奇数时两个数会互换,而是偶数时就不会互换,举个例子如下:

#include <iostream>
using namespace std;
void swap (int n,int a,int b)
{
if (n == 1)
{
cout << "a="<< a << "\tb=" << b << endl;
return;
}
else
{
swap(n-1,b,a);
}
}
int main (void)
{
int a = 1;
int b = 2;
swap(3,a,b);
}

在这个例子中,当main函数中个传参的第一参数是奇数时a,b就不会互换,偶数时就会互换,这也是个互换数字的算法呢!

例外附注一下,汉洛塔的递归调用的个数是2的n次方减1,故大家在试的时候,不要输入太大的n值,以免在DOS下看不全结果!!

汉洛塔递归实现的思考(C语言)的更多相关文章

  1. 数据结构--汉诺塔递归Java实现

    /*汉诺塔递归 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面 * 2.将编号N的1个圆盘,从A移动到C上面 * 3.最后将B上面的N-1个圆盘移动到C上面 * 注意:盘子的编号从上到下1-N ...

  2. 化繁为简 经典的汉诺塔递归问题 in Java

    问题描述   在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑 ...

  3. UVA 10795 A Different Task(汉诺塔 递归))

    A Different Task The (Three peg) Tower of Hanoi problem is a popular one in computer science. Briefl ...

  4. C++汉诺塔递归实现

    程序背景: 汉诺塔(Tower of Hanoi)又称河内塔,问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命 ...

  5. C++基础算法学习——汉洛塔问题

    汉诺塔问题古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中, ...

  6. Python之汉诺塔递归运算

    汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...

  7. c语言-汉诺塔递归调用

    #include<stdio.h> int main() { void hano_tower(int n,char one,char two,char three); int m=0; p ...

  8. C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)

    本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...

  9. 汉诺塔python3函数编写和过程分析

    !/usr/bin/env python3 -- coding: utf-8 -- 利用递归函数计算阶乘 N! = 1 * 2 * 3 * ... * N def fact(n): if n == 1 ...

随机推荐

  1. Quartz.NET管理类

    最近做项目设计到Quartz.NET,写了一个Quartz.NET管理类,在此记录下. public class QuartzManager<T> where T : class,IJob ...

  2. 实现多个ContentProvider对多张表进行操作

    http://blog.csdn.net/maylian7700/article/details/7365373 SQLite数据库直接操作类: DatabaseHelper.java package ...

  3. 你好,C++(3)2.1 一个C++程序的自白

    第2部分 与C++第一次亲密接触 在浏览了C++“三分天下”的世界版图之后,便对C++有了基本的了解,算是一只脚跨入了C++世界的大门.那么,怎样将我们的另外一只脚也跨入C++世界的大门呢?是该即刻开 ...

  4. [LeetCode OJ]-Climbing Stairs

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  5. POJ 1830.开关问题(高斯消元)

    题目链接 Solutin: 将每个开关使用的情况当成未知数,如果开关i能影响到开关j,那么系数矩阵A[j][i]的系数为1. 每个开关增广矩阵的值是开关k的初状态异或开关k的目标状态,这个应该很容易想 ...

  6. 【BZOJ2120】【块状链表】数颜色

    Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...

  7. 第三篇、调优之路 Apache调优

    1.  简介 在第一篇中整合了apache + tomcat ,利用了apache解析静态文件为tomcat解压.但是在测试机上发现两者性能不足,不能充分利用服务器的性能,该篇中将对apache进行性 ...

  8. linux常用命令(查看某些软件是否已安装)

    查看imap是否已安装 rpm -qa | grep imap 以下为未安装的情形: 检查是否已安装sendmail: rpm -qa | grep sendmail 以下为已安装的返回:

  9. openshif ssh proxy

    最近google又被墙了.没办法 1:注册一个openshift账号.申请注册一个app,获取一个免费主机.   https://www.openshift.com/ 2:去PuTTY官方网站下载pL ...

  10. bzoj2260: 商店购物 && 4349: 最小树形图

    Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...