返回
阅读【遮天】的帖子
谈谈递归函数的运用吧
版块:C4droid
在C++的自定义函数中,有一种调用方式是从它自身函数体中调用自身。
比如,计算1+3+5+7+···+(2n-3)+(2n-1)的值,可以这样定义函数体:
这段代码的大致描述如下:
一只猴子第一天摘了很多桃子,之后每一天都吃掉桃子总数的一半多一个。到了第10天,桃子总数只剩一个。
试求第9至第1天的桃子数量分别是多少。
你是如何理解第8行语句的?
备注:
std::cout代表C++中的标准输出流,连接符为“<<”,作用类似于C中的printf();
std::cin代表C++中的标准输入流,连接符为“>>”,作用类似于C中的scanf()。
比如,计算1+3+5+7+···+(2n-3)+(2n-1)的值,可以这样定义函数体:
int add_result(int n)
{
if (n == 1)
return 1;
else
{
int sum;
sum = n + add_result(n - 2);
return sum;
}
}
int main()
{
int a;
std::cin >> a;
a = 2 * a - 1;
std::cout << add_result(a) << "\n";
system("pause");
return 0;
}
当然,这只是其中一种。另一种递归函数更难理解,比如下面这个(此部分代码由慕课网课程改编):int getPeachNumber(int n)
{
int num; //定义所剩桃子数量
if (n == 10)
return 1;
else
{
num = 2 * (getPeachNumber(n + 1) + 1);
std::cout << "第" << 10 - n << "天剩余桃子为" << num << "个\n";
return num;
}
}
int main()
{
int number = getPeachNumber(1);
std::cout << "猴子第一天摘了" << number << "个桃子\n";
system("pause");
return 0;
}
这段代码的大致描述如下:
一只猴子第一天摘了很多桃子,之后每一天都吃掉桃子总数的一半多一个。到了第10天,桃子总数只剩一个。
试求第9至第1天的桃子数量分别是多少。
你是如何理解第8行语句的?
备注:
std::cout代表C++中的标准输出流,连接符为“<<”,作用类似于C中的printf();
std::cin代表C++中的标准输入流,连接符为“>>”,作用类似于C中的scanf()。
(adsbygoogle = window.adsbygoogle || []).push({});
- 0
- 0收藏帖子
- 0关注帖子
- 0
本贴有需要购买的内容
共 17 条评论
排序:时间 降序
请文明交流~
莫小应
15楼 2016-09-26 13:36
第二种我就把你定义得函数写成get吧,太长难得打字,假设n等于1num就等于2*(get(2)+1),get(2)又等于2*(get(3)+1),就这样一些调用到get(10),因为get(10)的值我们是知道的,然后就可以得出结果,然后返回num的值了。(我也是才学的c,错的地方大神轻喷)
00
12楼
你可以将上述代码中的std::cin>>和std::cout<<改成scanf和printf的形式,再删掉system("pause");就可以了。好市民有点意思,可我是学c的,字母敏感,不能直接调用
00
5楼
让我们来看看它是如何被调用的吧,
首先理解:int getPeachNumber(n); //定义以n为形参的自定义函数
然后理解:getPeachNumber(n+1); //调用自定义函数,并将n+1的值赋给形参n,即求n=n+1时此函数的返回值
最后理解:num = (getPeachNumber(n+1)+1)*2;
从n=1开始 因为不等于10所以将1代入上式即:
n==1时执行到num=(getPeachNumber(1+1)+1)*2 此时()内为2,即开始执行n==2时的递归函数
n==2时 执行到num=(getPeachNumber(2+1)+1)*2 此时()内为3,即开始执行n==3时的递归函数
n==3时 执行到num=(getPeachNumber(3+1)+1)*2 此时()内为4,即开始执行n==4时的递归函数
n==4时 执行到num=(getPeachNumber(4+1)+1)*2 此时()内为5,即开始执行n==5时的递归函数
n==5时 执行到num=(getPeachNumber(5+1)+1)*2 此时()内为6,即开始执行n==6时的递归函数
n==6时 执行到num=(getPeachNumber(6+1)+1)*2 此时()内为7,即开始执行n==7时的递归函数
n==7时 执行到num=(getPeachNumber(7+1)+1)*2 此时()内为8,即开始执行n==8时的递归函数
n==8时 执行到num=(getPeachNumber(8+1)+1)*2 此时()内为9,即开始执行n==9时的递归函数
n==9时 执行到num=(getPeachNumber(9+1)+1)*2 此时()内为10,即开始执行n==10时的递归函数
n==10,时,即执行return 1; 结束递归并返回值为1,即:getPeachNumber(9+1)=1,因为第10层递归结束了,所以要计算每层递归函数的返回值,以及后面的语句:printf("第%d天所剩桃子%d个\n", n, num);
返回结果:
因为运行到n==10时我们得出getPeachNumber(9+1)=1,所以当n==9时就可以算出来了:
n==9时,num=(getPeachNumber(9+1)+1)*2 ——>num=(1+1)*2 =4
输出:第9天所剩桃子4个
n==8时,num=(getPeachNumber(8+1)+1)*2 ——>num=(4+1)*2 =10
输出:第8天所剩桃子10个
以此类推:
第7天所剩桃子22个
第6天所剩桃子46个
第5天所剩桃子94个
第4天所剩桃子190个
第3天所剩桃子382个
第2天所剩桃子766个
第1天所剩桃子1534个
最后再执行:
printf("猴子第一天摘了:%d个桃子。\n", num);
猴子第一天摘了:1534个桃子。
首先理解:int getPeachNumber(n); //定义以n为形参的自定义函数
然后理解:getPeachNumber(n+1); //调用自定义函数,并将n+1的值赋给形参n,即求n=n+1时此函数的返回值
最后理解:num = (getPeachNumber(n+1)+1)*2;
从n=1开始 因为不等于10所以将1代入上式即:
n==1时执行到num=(getPeachNumber(1+1)+1)*2 此时()内为2,即开始执行n==2时的递归函数
n==2时 执行到num=(getPeachNumber(2+1)+1)*2 此时()内为3,即开始执行n==3时的递归函数
n==3时 执行到num=(getPeachNumber(3+1)+1)*2 此时()内为4,即开始执行n==4时的递归函数
n==4时 执行到num=(getPeachNumber(4+1)+1)*2 此时()内为5,即开始执行n==5时的递归函数
n==5时 执行到num=(getPeachNumber(5+1)+1)*2 此时()内为6,即开始执行n==6时的递归函数
n==6时 执行到num=(getPeachNumber(6+1)+1)*2 此时()内为7,即开始执行n==7时的递归函数
n==7时 执行到num=(getPeachNumber(7+1)+1)*2 此时()内为8,即开始执行n==8时的递归函数
n==8时 执行到num=(getPeachNumber(8+1)+1)*2 此时()内为9,即开始执行n==9时的递归函数
n==9时 执行到num=(getPeachNumber(9+1)+1)*2 此时()内为10,即开始执行n==10时的递归函数
n==10,时,即执行return 1; 结束递归并返回值为1,即:getPeachNumber(9+1)=1,因为第10层递归结束了,所以要计算每层递归函数的返回值,以及后面的语句:printf("第%d天所剩桃子%d个\n", n, num);
返回结果:
因为运行到n==10时我们得出getPeachNumber(9+1)=1,所以当n==9时就可以算出来了:
n==9时,num=(getPeachNumber(9+1)+1)*2 ——>num=(1+1)*2 =4
输出:第9天所剩桃子4个
n==8时,num=(getPeachNumber(8+1)+1)*2 ——>num=(4+1)*2 =10
输出:第8天所剩桃子10个
以此类推:
第7天所剩桃子22个
第6天所剩桃子46个
第5天所剩桃子94个
第4天所剩桃子190个
第3天所剩桃子382个
第2天所剩桃子766个
第1天所剩桃子1534个
最后再执行:
printf("猴子第一天摘了:%d个桃子。\n", num);
猴子第一天摘了:1534个桃子。
00
最后一页