永发信息网

C++递归问题,流程,意思

答案:2  悬赏:70  手机版
解决时间 2021-08-22 05:57

说得好可以追加分数,谢谢了!

我想问的是递归运算的流程是怎么样的?请详讲!谢谢!

主要想问下面程序中:

  hanio(num-1,aa,cc,bb);//这句是什么意思?里面的参数是代表什么?什么意思?
   cout<<"移动第"<<num<<"的盘 从"<<aa<<"柱到"<<cc<<"柱\n";
  hanio(num-1,bb,aa,cc);//这句是什么意思?里面的参数又是代表什么?什么意思?

//下面是一个河内塔问题。

#include<iostream.h>
void hanio(int num,char aa,char bb,char cc)
{
 if(num>0)
 {
  hanio(num-1,aa,cc,bb);
   cout<<"移动第"<<num<<"的盘 从"<<aa<<"柱到"<<cc<<"柱\n";
  hanio(num-1,bb,aa,cc);
 }
 return;

}
void main()
{
 int num;
  cout<<"请输入共需移动多少个盘(>0):";
   cin>>num;
 hanio(num,'A','B','C');
 return;

}

最佳答案
main函数不管,关键在于递归函数。递归函数调用自己,将同样的问题细分。
汉诺塔的移动盘子的问题可以细分为多个相似的子问题。首先,你要明白,这个问题划分,是如何划分的。就本题而言,我们需要将num个盘子从A移动到C,需要B作为中介。那么,A中最大的盘子必然是要放在C上的。你可以假想,我们移动盘子的时候,到了眼下这一步:A中只留下了最大的盘子,其余盘子由小到大依次放在了B上,C上为空。接下来的一步为,将A上的盘子移动到C上。
此时的柱子上的盘子情况为,A :空;B:由小到大(num-1)个;C: 最大的盘子。
接下来,要将B上的最大的盘子,放到C上,A作为中介。这个问题,就是刚才我们解决的问题的子问题了,结果为,A:由小到大(num-2)个;B:空;C,两个盘子。
它们的解决方法是一样的,只是问题规模在逐渐缩小。
递归解决问题的思路与我们正常解决问题的思维方式有点不同,它先从眼前最大规模的问题(本题即为:先将最大的盘子移动到C上)进入递归函数,然后才一步步地细分。
void hanio(int num,char aa,char bb,char cc)
{
 if(num>0)
 {
  hanio(num-1,aa,cc,bb);    //在做下一步时,首先要将本柱子上的其他盘子移到中介柱子上,只留下最大的盘子(<num>个盘子中,最大的一个盘子。)。可以理解为:aa借助cc移动到bb上。
   cout<<"移动第"<<num<<"的
盘 从"<<aa<<"柱到"<<cc<<"柱\n";  //这一步就是移动最大的盘子到目的柱子上。
  hanio(num-1,bb,aa,cc);    //这一步是将其他的盘子从中介柱子上移动到刚才最大盘子所在的柱子上。可以理解为:bb借助aa移动到cc上。
 }
}  //我所说的中介柱子,目的柱子,都是每个子问题对应的。例如刚才所说的情况:A :空;B:由小到大(num-1)个;C: 最大的盘子。这时,A就是中介柱子,而不是B。
不晓得我说的这些你能看明白不。这是我对递归的理解。写个简单的递归函数吧,比如,整数num的阶乘。
递归分解为 num!=num*(num-1)!,然后(num-1)!=(num-1)*(num-2)!,以此类推。
当然,这个问题可以一个for/while循环解决。。。。我只是在举例说明递归函数如何分解子问题。
int result(int num)
{
    if(num>1)
    return num*result(num--);
    else
    return 1;
}
我个人C学的不是很好,但是希望对你有所帮助。如有错误,请指正。
全部回答

递归的思想是逐渐化大为小,并自身循环。就像剥洋葱,最终把问题层层分解,落脚在小问题上。

这是个汉诺塔的问题,实现了汉诺塔问题的步骤解析。(就是说它会输出你应如何放盘)  void hanio(int num,char aa,char bb,char cc)这句话是在 定义函数。hanio是函数名,里面的是函数参数,分别是整型和三个字符型。 我来详细解答吧。唉,好困了

void hanio(int num,char aa,char bb,char cc)//定义函数
{
 if(num>0)
 {
  hanio(num-1,aa,cc,bb);
   cout<<"移动第"<<num<<"的盘 从"<<aa<<"柱到"<<cc<<"柱\n";
  hanio(num-1,bb,aa,cc);
 }
 return;

}//有“num”个盘,三个柱(aa,cc,bb).没执行一次函数,num就自减1,输出走法。注意,aa,bb,cc在执行时是变动的,以此实现不同走法。你注意到他的循环了吗?知道num减为0才停止。哈哈,这就是神奇的递归!
void main()//这是主函数,要先看主函数,才明白在干什么
{
 int num;
  cout<<"请输入共需移动多少个盘(>0):"; //这是汉诺塔的级别了
   cin>>num;
 hanio(num,'A','B','C');//函数声明
 return 0;

}

 

楼主觉得满意就采纳吧,我在完成任务,感谢你的支持!

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样查看2010公务员是否报名成功
万宁民族中学考不上,报名多少钱
课题组专家鉴定意见,初中课堂有效教学策略的
谁知道到文山的货运部的联系方式?
常见的升华和凝华的现象
岳阳县岳阳毛田旅社我想知道这个在什么地方
方向盘间隙不能超过多少度
真实姓名能改吗?
lf you want to ask the other one who you a
DNF中强化武器和COF有关吗? 还跟爆装备有关
哪儿位高人帮我解释一下这句话的意思.
摩天大樓日常任務領取獎勵怎麼領不了了
红安县黄冈红梅宾馆(桥西市场巷)怎么去啊,谁
红色的天空是怎么回事,回忆是红色天空 歌词
步步惊心四爷经典台词,步步惊心小说中有对木
推荐资讯
为什么内存卡文件一直丢失,是手机的内存卡
男士雨伞什么牌子好,最好的雨伞牌子
在这个世界上、对我们来说什么才是最重要的?
赛尔号8月6日卡兰杯怎么加油按的快?
买手提电脑主要哪些情况,(包括售后服务注意
英文斜体怎么打,AI文件的文字要怎样设置为斜
赣州第三人民医院在什么位置
彩虹岛收费问题
最爱的铅笔伞的骨架断了,没有的配,怎么办,
文件图标都不见了
仓鼠能晒太阳吗,为什么仓鼠不能晒太阳
1/12+12/123+123/1234+1234/12345+12345/1234
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?