VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 499|回复: 5

[求助] 关于多个递归调用的递归问题

[复制链接]
36_avatar_middle
在线会员 yq1557 发表于 2018-3-31 16:53:15 | 显示全部楼层 |阅读模式
13驿站币
麻烦大家看一下,这段包含有多个递归调用的递归代码,
书上说,自定义函数sub()“调用次数将呈几何级数增长,调用一次导致两个调用,然后导致4个调用,再导致8个调用,以此类推。”
但我根本没有看明白,我是这样分析的:
例如假设sub1(如图注释)命令中level = 3,当程序执行到sub1语句时,会循环执行28行-38行的代码,直到level=0;
然后程序又与调用函数相反的顺序执行sub2(如图注释)语句3次,那么调用sub自定义函数总共6次呀,不是8次;
我知道自己的理解有问题,可是我不知道该怎样正确理解sub函数调用次数,
谁能帮帮我,给我讲解一下。
图片如下:
这是源码:
  1. #include<iostream>
  2. const int leng = 66;
  3. const int ceng = 6;
  4. void sub(char ch[], int min, int max, int level);
  5. int main()
  6. {
  7.         using namespace std;
  8.         char ar[leng];       
  9.         int i;
  10.         for (i = 1; i < leng - 2; i++)
  11.                 ar[i] = ' ';
  12.         ar[leng - 1] = '\0';
  13.         int ma = leng - 2;
  14.         int mi = 0;
  15.         ar[mi] = ar[ma] = '|';
  16.         cout << ar << endl<<endl;
  17.         for (i = 1; i <= ceng; i++)
  18.         {
  19.                 sub(ar, mi, ma, i);
  20.                 cout << ar << endl<<endl;
  21.                 for (int j = 1; j < leng - 2; j++)
  22.                         ar[j] = ' ';
  23.         }
  24.         cin.get();
  25.         cin.get();
  26.         return 0;
  27. }
  28. void sub(char ch[], int min, int max, int level)
  29. {
  30.         using namespace std;
  31.         if (level == 0)
  32.         {
  33.                
  34.                 return;
  35.         }
  36.         int mid = (min + max) / 2;
  37.         ch[mid] = '|';
  38.         sub(ch, min, mid, level-1);
  39.         sub(ch, mid, max, level-1);
  40. }
复制代码

源码

源码

运行源码后的输出

运行源码后的输出

最佳答案

查看完整内容

这个程序的逻辑流程最好还是楼主自己下断点跟几次就明白了,用文字来描述还真是太多了: @@@ 首先 i = 1 第一次进入: 进入sub函数: mi = 0,ma = 64,level = 1; mid = (64 + 0) / 2 = 32 进入 sub1 函数: mi = 0,ma = 32,level = 0; 退出! 进入 sub2 函数: mi = 32,ma = 64,level = 0; 退出! @@@ 之后 i = 2 第二次进入: 进入 sub 函数: mi = 0,ma = 64,level = 2; mid = (64 ...




上一篇:SDK开发中,如何注册编辑框改变事件?
下一篇:老狼Gh0st服务端 的编译问题

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2018-3-31 16:53:16 | 显示全部楼层
yq1557 发表于 2018-3-31 17:44
不好意思,没考虑这方面的问题,这是源码:


这个程序的逻辑流程最好还是楼主自己下断点跟几次就明白了,用文字来描述还真是太多了:

@@@ 首先 i = 1 第一次进入:

进入sub函数:
mi = 0,ma = 64,level = 1;
mid = (64 + 0) / 2 = 32

进入 sub1 函数:
mi = 0,ma = 32,level = 0;
退出!

进入 sub2 函数:
mi = 32,ma = 64,level = 0;
退出!


@@@ 之后 i = 2 第二次进入:

进入 sub 函数:
mi = 0,ma = 64,level = 2;
mid = (64 + 0) / 2 = 32

进入 sub 的 sub1 函数:
mi = 0,ma = 32,level = 1;
mid = (32 + 0) / 2 = 16

再次进入 sub 的 sub1 的 sub1 函数,
mi = 0,ma = 16,level = 0;
退出!
再次进入 sub 的 sub1 的 sub2 函数,
mi = 16,ma = 32,level = 0;
退出!

进入 sub 的 sub2 函数:
mi = 32,ma = 64,level = 1;
mid = (32 + 64) / 2 = 48
再次进入 sub 的 sub2 的 sub1 函数,
mi = 32,ma = 48,level = 0;
退出!
再次进入 sub 的 sub2 的 sub2 函数,
mi = 48,ma = 64,level = 0;
退出!

以此类推吧!希望楼主能明白

点评

回答给力  发表于 2018-3-31 22:15

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

51_avatar_middle
online_admins Syc 发表于 2018-3-31 17:28:27 | 显示全部楼层
楼主把代码复制下发上来吧,这样我们也好调试讲解,不然一张图片我们还得手动敲代码哦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

36_avatar_middle
ico_lz  楼主| yq1557 发表于 2018-3-31 17:44:34 | 显示全部楼层
Syc 发表于 2018-3-31 17:28
楼主把代码复制下发上来吧,这样我们也好调试讲解,不然一张图片我们还得手动敲代码哦


不好意思,没考虑这方面的问题,这是源码:
  1. #include<iostream>
  2. const int leng = 66;
  3. const int ceng = 6;
  4. void sub(char ch[], int min, int max, int level);
  5. int main()
  6. {
  7.         using namespace std;
  8.         char ar[leng];       
  9.         int i;
  10.         for (i = 1; i < leng - 2; i++)
  11.                 ar[i] = ' ';
  12.         ar[leng - 1] = '\0';
  13.         int ma = leng - 2;
  14.         int mi = 0;
  15.         ar[mi] = ar[ma] = '|';
  16.         cout << ar << endl<<endl;
  17.         for (i = 1; i <= ceng; i++)
  18.         {
  19.                 sub(ar, mi, ma, i);
  20.                 cout << ar << endl<<endl;
  21.                 for (int j = 1; j < leng - 2; j++)
  22.                         ar[j] = ' ';
  23.         }
  24.         cin.get();
  25.         cin.get();
  26.         return 0;
  27. }
  28. void sub(char ch[], int min, int max, int level)
  29. {
  30.         using namespace std;
  31.         if (level == 0)
  32.         {
  33.                
  34.                 return;
  35.         }
  36.         int mid = (min + max) / 2;
  37.         ch[mid] = '|';
  38.         sub(ch, min, mid, level-1);
  39.         sub(ch, mid, max, level-1);
  40. }
复制代码

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

36_avatar_middle
ico_lz  楼主| yq1557 发表于 2018-3-31 22:15:05 | 显示全部楼层
Syc 发表于 2018-3-31 21:07
这个程序的逻辑流程最好还是楼主自己下断点跟几次就明白了,用文字来描述还真是太多了:

@@@ 首先 i ...

你的回答很给力,完美的解决了我的疑问,谢谢您!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-12-12 12:15

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表