首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言解决问题【C语言&

问题背景 (Tower of Hanoi),又称河内,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。...运用函数递归解决问题 函数递归的思想就是将复杂的问题简单化 我们可以先考虑2个圆盘的情况下,先a->b然后a->c最后b->c 我们在考虑3个圆盘的情况,用图片表示 通过这两个例子我们可以观察到要将...n个盘子移动到C 就要先将n-1个盘子移动到B,由此我们可以已得到一个思路 代码实现的思路主要为三步: 假设移动n个盘子 1.将A柱上的n-1个盘子借助C柱移动到B柱 2.再将A柱上仅剩的最后一个盘子移动到...B柱 3.最后再将B柱上的n-1个盘子借助A柱移动到C柱 代码实现 #include void move(char pos1,char pos2)//打印过程 { printf...("%c->%c ", pos1, pos2); } void Hanoi(int n,char pos1,char pos2,char pos3)//pos1起始柱 pos2为工具柱 pos3为目标柱

11010

经典递归解决_c语言递归算法

当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。...当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C),然后将A塔上的3号最大的盘子移动到C,最后将B塔上的两个盘子借助A移动到C塔上。...当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A移动到C塔上。...#include //第一个为初始,中间的为借用,最后一个为目标 int i=1;//记录步数 void move(int n,char from,char to) //...将编号为n的盘子由from移动到to { printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to); } void hanoi(int n,char from

34620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言经典递归题目 -- 问题

    目录 题目描述 画图分析 思路总结 代码实现 总结 题目描述 问题起源于一个传说 又被称为河内,传说,在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。...印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的。...僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵、庙宇和众生也都将同归于尽。 我们现在要研究的就是在不同情况下盘子的移动顺序和移动的次数。...>%c ", pos1, pos2); //把pos1的盘子移动到pos2 } //Hanoi函数,用来实现,其中n表示盘子的个数,pos1表示起始柱,pos2表示中转柱,pos3表示目标柱...pos3); //n为3 printf("\n"); Hanoi(4, pos1, pos2, pos3); //n为4 printf("\n"); return 0; } 总结 知道了的逻辑后

    42200

    汇编语言、与C语言、实现----

    题意描述:      用汇编语言实现。只需要显示移盘次序,不必显示所移盘的大小,例如: X>Z,X>Y,Z>Y,X>Z,....。...(n阶Hanoi问题)假设有三个分别命名为X、Y、Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。...的实现,用C语言来解释就是函数递归调用实现 如果转为汇编实现,就直接进入栈进行相应的操作就行(当然你也可以用汇编语言宏实现高级的递归调用..)...C语言方式: void move(char one,char three){ //one 移到thre printf("%c--->%c",one,three); } void HANOI(...} } // end of void HANOI(5,'X','Y','Z'); //即可5阶从X盘移到Z盘 递归操作仔细想想就可以了,这样栈的操作逐渐明朗

    1.7K20

    函数递归 - (C语言实现)

    思路: 有1个盘子时: 2^1 - 1次 A->C ---- 有2个盘子时: 2^2 - 1次 A->B A->C C->B 有3个盘子时: 2^3 - 1次 A->C A->B C-...>B A->C B->A B->C A->C ---- 3个盘子的简单模拟: ---- ---- 采用递归思想: 初始柱子、目标柱子、中间柱子是相对具体的盘子而言的,但最终所有的盘子均要按规则移动到...C盘之上。...从初始柱子A经过中间柱子C移动到 目标柱子B。 2.对于下面的这1个盘子需要移动到C柱子上。 故C柱子此时是目标柱子,B柱子是中间柱子。...故B柱子是这个总体的初始柱子,这个总体最终需要移动到C柱子上,故C柱子此时便是目标柱子,而A柱子是中间柱子。 看做从初始柱子B经过中间柱子A移动到目标柱子C。 ---- 3.

    23210

    问题

    /*有n个盘子,都在A上,盘子大小均不等,要求大的在下,小的在上, 有A, B, C三个地方,要求将这n个盘子从A移动到C处,每次只能移动 一个盘子*/ /*思路: 当有两个盘子时,只需将...1个盘子从A移动到B,便可直接将最后一个 盘子移动到C,然后将上一个盘子移动到B,结束任务;依此类推,对于 n个盘子,只需将上面n-1个盘子借助C移动到B,再将第n个盘子移动到...C,最后 将那n-1个盘子借助A移动到C,便可完成任务*/ #include void hannoi(int n, char A, char B, char C) {...if(n == 1) printf("move dish %d from %c to %c\n",n, A, C); else { hannoi(...n - 1, A, C, B); /*将第n个盘子上面n-1个盘子借助C移动到B*/ printf("move dish %d from %c to %c\n",n, A, C);

    55430

    问题

    问题   最近面试题遇到过的问题,当时竟然懵逼了,不会了!!大学研究的问题竟然都忘光了,于是抓紧捡起来。然而在网上看了看博客,发现非递归算法还真挺多。下面总结了一下。...2)将第N个盘子移动到C柱。...- 1, a, c, b); // 将当前a柱的n-1个盘子,通过c移动到b 13 System.out.println(a + "-->" + c);//将a柱子上的最大的盘子移动到...c柱 14 move(n - 1, b, a, c); // n-1个移动过来之后b柱成为a柱,这里就变成了n-1个盘子从b移动到c柱。...E.每一层都是以A未开始,以C为结束     F.奇数层规律是A->C,C->B,B->A,依次循环     G.偶数层规律是A->B,B->C,C->A,依次循环   根据上面的特点进行进一步总结得到

    65810

    Hanoi(

    说明: (河内)(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard...Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小 至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒...,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当 盘子全数搬运完毕之时,此将毁损,而也就是世界末日来临之时。..." to " C);         HANOI(n-1, B, A, C);      }     } C: #include void hanoi(int n, char A, ...char B, char C)  {     if(n == 1)      {         printf("Move sheet %d from %c to %c\n", n, A, C);

    96020

    递归c_递归实现问题

    思路 因为要将 A 柱上的圆盘全部转移到 C 柱上,所以先将最下面的最大的圆盘转移到 C 柱,将上面所有的圆盘看成一个整体,那么将这个整体转移到 B 柱上就可以将最大的圆盘转移到 C 柱了。...然后,将现在 B 柱上最大的圆盘转移到 C 盘上需要借助 A 盘。重复上面的步骤,利用递归的思想。...); } } package Recursion; public class _05_Tower { // num 表示要移动的个数, a,b,c 分别表示A, BC public void..."->" + c); }else{ //如果有多个盘,可以看成两个,最下面的和上面的所有盘 //(1)先移动上面所有的盘到 b,借助 c move(num - 1, a, c, b); //(2)...把最下面的的这个盘,移动到 c System.out.println(a + "->" + c); //(3)再把 b的所有盘,移动到c , 借助a move(num - 1, b, a, c); }

    34230

    (三)

    (三) 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。...印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的。...僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵、庙宇和众生也都将同归于尽。 现在我们把三根针编号为1,2,3。...输入第一行输入一个整数N表示测试数据的组数(N<10) 每组测试数据的第一行有两个整数P,Q(1<P<64,1<Q<100),分别表示的层数与随后指令的条数 随后的Q行,每行都输入两个整数a,b,

    61010

    问题

    问题 学递归,跳不过这个程序。以前弄NOIP,老师很详细地讲过的原理以及实现算法,不过我上大学了却发现老师讲到,只是像一笔带过,原理都没讲通,更别说算法了。...我相信像他那么讲,没一个同学(没基础的)能弄得懂,就算你给一个flash的游戏,也不见得会玩。 真的挺有意思的,我写这篇文章,也算是回忆回忆以前学过的知识。如果有什么错误,还请原谅。...没有听说过的人,可以去baidu查查,或则你去http://www.4399.com/flash/293.htm 玩一玩,大概就知道是干什么的了。...这么写:hanota(n,x,y,z); 于是我们上面的三步可以用程序语言来表达: hanota(n-1,A,C,B); hanota(1,A,B,C); hanota(n-1,B,A,C); 这是三个盘子时候的情况...最后给大家和我自己留一个问题:是三根柱子,如果我们有四根柱子,我们又怎样移动盘子,或者说怎样移动使步数最少?有时间我会想想这个问题,以后写一个“拓展”。

    1.2K21
    领券