这是个汉诺塔程序,在调试的时候,输入的数字最好不要大于15,因为每大一个数所得的结果的步骤都会多一倍。如果你有耐心等待结果的话除外。汉诺塔是在欧洲流行的一种游戏,有a,b,c三个竿。a竿上有若干个由大到小的圆盘,大的在下面,小的在上面,b,c都是空杆,请你把a杆上的圆盘都倒到别的杆上,或b或c,在倒盘的过程中不可以大的压小的,实例程序如下:
#include <stdio.h> #include <stdlib.h> void move(char x,char y) { printf("%c-->%c\n",x,y); } void hanoi (int n,char one ,char two,char three) { if(n==1) move (one ,three); else { hanoi (n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } int main() { int m; printf("input the number of diskes:"); scanf("%d",&m); printf("the step to moving %3d diskes:\n",m); hanoi(m,'A','B','C'); system("pause"); }
#include <stdio.h> #include <conio.h> int i=0; void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle){ if(n>0){ movedisc(n-1,fromneedle,usingneedle,toneedle); i++; switch(fromneedle){ case 'a': switch(toneedle){ case 'b':printf("\t[%d]:\t%2d------>%2d\n",i,n,n); break; case 'c':printf("\t[%d]:\t%2d------------->%2d\n",i,n,n); break; } break; case 'b': switch(toneedle){ case 'a':printf("\t[%d]:\t%2d<----------%2d\n",i,n,n); break; case 'c':printf("\t[%d]:\t\t%2d------>%2d\n",i,n,n); break; } break; case 'c': switch(toneedle){ case 'a':printf("\t[%d]:\t%2d<--------------%2d\n",i,n,n); break; case 'b':printf("\t[%d]:\t\t%2d<--------%2d\n",i,n,n); break; } break; } movedisc(n-1,usingneedle,toneedle,fromneedle); } } int main(){ unsigned n; printf("Please enter the number of discs: "); scanf("%d",&n); printf("\tneedle:\ta\t b\t c\n"); movedisc(n,'a','c','b'); printf("\t Total: %d\n",i); getch(); }
#include <stdio.h> #define width (rings+1) int main(){ int rings, last, next, x, z[500], s[3]; printf("how many rings? "); scanf("%d",&rings); for(x=1; x<=rings; x++) /* put rings on first peg */ z[x]=width-x; for(x=0; x<=2*width; x+=width) /* set base for each peg */ z[x]=1000; /* if even number of rings, put first ring on second peg; if odd, on third */ if(rings%2==0){ last=1; s[2]=0; s[1]=1; z[width+1]=z[rings]; }else{ last=2; s[1]=0; s[2]=1; z[2*width+1]=z[rings]; } printf("from 1 to %d\n",last+1); s[0]=rings-1; while(s[0]+s[1]){ /* while first and second pegs aren't empty */ /* next ring to move is smaller of rings on the two pegs not moved onto last */ if(last==0) next=z[width+s[1]]<z[2*width+s[2]]?1:2; if(last==1) next=z[s[0]]<z[2*width+s[2]]?0:2; if(last==2) next=z[s[0]]<z[width+s[1]]?0:1; /* top ring of 'to' peg must be larger and an even 'distance' away */ if((z[next*width+s[next]])>(z[last*width+s[last]])||((z[last*width+s[last]]-z[next*width+s[next]])%2==0)) last=3-next-last; printf("from %d to %d\n",next+1,last+1); s[next]=s[next]-1; s[last]=s[last]+1; /* move from 'next' to 'last' peg */ z[last*width+s[last]]=z[next*width+s[next]+1]; } }
#include <stdio.h> //-------------------------------------------------------- // 打印搬运动作 //-------------------------------------------------------- int MoveIt(int x,int Source,int Target) { printf("Move %d From %d to %d\n",x,Source,Target); return 0; } //-------------------------------------------------------- // 用 4 根柱子移动盘子 // n 是盘子个数,编号从1 到 n // First 是源柱子号 // Second Third 是两根过渡柱 // Fourth 是目标柱 //-------------------------------------------------------- int MoveHanoi(int n,int First,int Second,int Third,int Fourth) { if (n<1) return 0; // 如果没有盘子就返回 if (n==1) // 如果只有一个盘子 { MoveIt(n,First,Fourth); // 就直接从源柱子移到目标柱子上 return 0; } if (n==2) // 如果有两个盘子 { MoveIt(n-1,First,Second); // 把上面的那片移到一个过渡柱上 MoveIt(n,First,Fourth); // 把下面的那片移到目标柱上 MoveIt(n-1,Second,Fourth); // 再把第 1 片从过渡柱移到目标柱上 return 0; } if (n==3) // 如果有 3 片盘子 { MoveIt(n-2,First,Second); // 把最小的盘子移到一个过渡柱上 MoveIt(n-1,First,Third); // 把中间盘子移到另一过渡柱上 MoveIt(n,First,Fourth); // 把最大的盘子移到目标柱上 MoveIt(n-1,Third,Fourth); // 把中间盘子移到目标柱上 MoveIt(n-2,Second,Fourth); // 把最小的盘子移到目标柱上 return 0; } // 递归地把上面 n-2 盘子移到一个过渡柱上 // 留下最大的两个盘子 MoveHanoi(n-2,First,Third,Fourth,Second); MoveIt(n-1,First,Third); // 把倒数第 2 个盘子移到另一个过渡柱上 MoveIt(n,First,Fourth); // 把最底下的盘子移到目标柱上 MoveIt(n-1,Third,Fourth); // 把倒数第 2 个盘子移到目标柱上 // 递归地把 n-2 个盘子从过渡柱上移到目标柱上 MoveHanoi(n-2,Second,First,Third,Fourth); return 0; } int main() { int num; scanf("%d",&num); MoveHanoi(num,1,2,3,4); return 0; }
#include <stdio.h> #include <math.h> #define MAX_N 1000 int main(){ double f[MAX_N]; int n,i,j; double maxvalue,curvalue; printf("Please input count:"); scanf("%d",&n); if(n>=MAX_N){ printf("Out of range\n"); return -1; } f[1]=1.0,f[2]=3.0; for(j=3;j<=n;j++){ maxvalue=pow(2,j); for(i=1;i<j;i++){ curvalue=2*f[i]+pow(2,j-i)-1; if(curvalue<maxvalue) maxvalue=curvalue; else break; } f[j]=maxvalue; } for(i=1;i<=n;i++) printf("m[%d]=%f\n",i,f[i]); return 0; }
不得不佩服递归魅力,非递归实现方式实现起来让人有点费解。
相关推荐
用非递归算法实现hanoi塔的源程序及算法说明 还包含用递归算法实现hanoi塔
文件文章为:Hanoi塔(汉诺塔)问题非递归算法的形式推导,论文用数学推导与证明的方法给出了Hanoi塔(汉诺塔)问题的算法,给出算法的最显著优点有二:1:算法不需要额外空间,即算法需要的额外空间与盘子数量无关,2:...
网上转载,对算法设计有兴趣的请慢慢研究
汉诺塔有递归与非递归两种算法,上面的算法是非递归方式进行的,该程序用c在tc2.0下编译通过
如题,不是本人的作品。。。用的是数学归纳的方法 很厉害的中学生的分析!!!!
形式化开发Hanoi塔问题非递归算法.针对Hanoi塔问题的形式化分析和思考,以及解决方案.
汉诺塔(Hanoi) 算法Java实现。通过三个函数,分别对Hanoi进行递归、非递归和非递归规律实现。
采用非递归的方式实现了汉诺塔问题.
汉诺塔递归与非递归结果对比,结果是no differences,说明非递归算法没错。递归算法参考了csdn另一名博主的博客。
递归算法,可以实现汉诺塔算法
用C++实现汉诺塔的递归算法,定义了类和方法。
一种解决hanoi问题的费递归算法的提出,以及c语言的实现源代码
汉诺塔(河内塔)的经典非递归算法 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不...
Hanoi递归过程分析图,利用展开法对hanoi的执行过程进行了分析!
汉诺塔递归算法: 问题抽象 3个塔,n个碟子 初始:所有碟子放在1号塔,大的在底下,小的在上面 任务:把碟子移动到2号塔,顺序不变, 可用3号塔辅助 限制 每次只能移动一个碟子 总是大碟子...
汉诺塔非递归程序,包含详细的解析、代码、结果及心得
绝对的很好的hanoi算法,对学习数据结构同学有很好的帮助
分析Hanoi问题,算法设计与分析,利用C/C++/Java等程序设计语言,实现本章节中分治算法、递归,汉诺塔问题
hanoi 递归实现 清楚明了 步骤 ACM