递归函数的经典例子(汉诺塔问题)

#include

void HN(int n,char a,char b,char c);

int main(int argc,char *argv[])

{

int Dish_num;

printf("Please Input the Dish num: ");

scanf("%d",&Dish_num);

while(Dish_num != 0){

printf("%d个盘子的移动步骤如下:\n",Dish_num);

HN(Dish_num,‘A‘,‘B‘,‘C‘);

printf("Please
Input the Dish num: ");

scanf("%d",&Dish_num);

}

while(1);

return 0;

}

void HN(int m,char a,char b,char c)

{

if(m==1){

printf("From
%c to %c\n",a,c);

}

else{

HN(m-1,a,c,b);

printf("From
%c to %c\n",a,c);

HN(m-1,b,a,c);

}

}

时间: 2024-10-11 14:51:16

递归函数的经典例子(汉诺塔问题)的相关文章

经典分治 - 汉诺塔游戏

分治策略: 将父问题划分为多个子问题(注:子问题与父问题一定要具有自相似性),然后找递归出口. 1.子问题规模变小.2.子问题与父问题本质等价. 汉诺塔游戏简述:三个柱A.B.C,将从大到小的盘按规则从A柱移到B柱. 具体的分治算法实现: 1 - N从A移动到B,C为辅助. 等价于: 1.1 - (N - 1)从A移动到C,B为辅助 2.把N从A移动到B 3.1 - (N - 1)从C移动到B,A为辅助 话说当时刚开始想这个问题的时候,我把2 - N当作一个子问题移动对象,将1盘移到辅助柱子上,

汉诺塔II(hdu1207)经典递推

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6070    Accepted Submission(s): 2966 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下

多柱汉诺塔最优算法

转自Florian 1. 三柱汉诺塔三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题.其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上[T(n-1)步],然后把A 柱剩下的一个碟子移到C 柱上[1步], 最后把B 柱上所有的碟子通过A 柱移到C 柱上[T(n-1)步].很容易得到算法的递归方程为:T(n)=2*T(n-1)+1,因此,不难算出步数是T(n)=2^n-1.对于三柱汉诺塔的算法的正确性自然是毫无争议的,我们需要的是从三柱汉诺塔的设计中引申出多柱

汉诺塔递归

#一日一词# 今天在学习Python的时候,遇到了递归问题,案例呢就是经典的汉诺塔游戏,表示虽然以前就接触过这游戏,解起来也很容易,不过放在编程里,几行的代码可够我手推了一个多小时.╭∩╮(︶︿︶)╭∩╮ 当然也是感受到了搞清楚一个(我认为的)难题的乐趣,心情大好,买条裤子. (表示从晚上一直整理到第二天,电脑没电所以今早发,生日与学习紧密结合)? 首先说下汉诺塔游戏,如下图,需要利用中间的柱子将左边的所有圆盘移动到最右边的柱子上,且和原来的大小上下顺序一致,移动过程中保证大盘永远在小盘下面.

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

汉诺塔递归实现

经典问题汉诺塔的实现中,递归实现可以说是代码量最少,并最简单易懂的实现方法了. 假设有三根柱子a,b,c.其中a柱子上有n个金片.我们的目的就是把n个金片借助b,全部移动到c上.这是一个汉诺塔问题. 这个问题可以分解成如下子问题: (1)将n-1个金片从a移动到b.这又是一个汉诺塔问题. (2)上面执行完之后,可以直接将第n个金片移动到c. (3)上面两步执行完之后,将n-1个金片从b移动到c.这又再次是一个汉诺塔问题. 很显然,把上面的步骤翻译成递归形式可以得到如下的程序: 1 #includ

Hdu 1207 汉诺塔II

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8433    Accepted Submission(s): 4162 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

lintcode:227.用栈模拟汉诺塔问题

在经典的汉诺塔问题中,有 3 个塔和 N 个可用来堆砌成塔的不同大小的盘子.要求盘子必须按照从小到大的顺序从上往下堆 (如,任意一个盘子,其必须堆在比它大的盘子上面).同时,你必须满足以下限制条件: (1) 每次只能移动一个盘子. (2) 每个盘子从堆的顶部被移动后,只能置放于下一个堆中. (3) 每个盘子只能放在比它大的盘子上面. 请写一段程序,实现将第一个堆的盘子移动到最后一个堆中. 具体思路在本笔记后面有记录! 以下为本人C++版详细过程!包括测试过程 1 class Tower { 2

HDU1207 汉诺塔II 【递推】

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4799    Accepted Submission(s): 2362 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下