请帮分析一下递归函数过程

zhangyuan850 2016-11-10 08:26:00
有一个递归函数求出数组里最大的数,俺没有理解,有数字序号的是俺添加的,主要是看看变量和数组值,请朋友帮分析其具体过程:

#include<iostream>
using namespace std;
int diguimax(int a[],int n)
{
int f;
if (n==1)
{
   /* cout<<"n==1"<<endl; (1)*/
   /* cout<<"n==1,a[0]="<<a[0]<<endl; (2)*/
return a[0];

}

f=diguimax(a+1,n-1);
/* cout<<"f="<<f<<",,a[0]="<<a[0]<<endl; (3)*/
if (f>a[0])
{
/* cout<<"f>a[0],f="<<f<<"a[0]"<<a[0]<<endl; (4)*/
return f;
}
/* cout<<"f bu dayu "<<f<<","<<a[0]<<endl; (5)*/
return a[0];

}
int main()
{
int c[]={7,29,36,28,6,-5};

cout<<diguimax(c,6)<<endl;
return 0;

}
主函数运行,diguimax(c,6)这步是调用函数diguimax( ),把数组和数组数量传递过去。
到了递归函数,由于n=6,所以第一个IF语句不成立,就到了f=diguimax(a+1,n-1);此时f=diguimax(a+1,5);a+1指向”29“,这个时候 f 好像没有被赋具体值吧,接着调用diguimax( )函数,这时n=5,第一个if 语句仍然不成立,还是f=diguimax(a+1,n-1);"a+1"指向“36”,下一次指向“28”,反复直到f=diguimax(a+1,n-1);“ a+1”指向“6”,n-1=3-1=2,再调用递归f=diguimax(a+1,n-1); “a+1”指向“-5”,n=1,再调用递归,到了第一个if 语句处,数字序号为(2) cout<<a[0]显示为"-5",到 了数字序号(3)处,f=-5, a[0]=6,这时f = -5理解,但是a[0]=6这步值怎么来的?在到数字序号(5)处:f= -5,a[0]=6,,然后return a[0]就是把a[0]=6返还给 f=diguimax(a+1,n-1)这个f ?到了下一行(3)处,则 f=6, a[0]=28到这里没有看明白,最后返回最大值为“36”,怎么递归又反向递归了啊。
请朋友帮给分析说明一下,谢谢。
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyuan850 2016-11-10
  • 打赏
  • 举报
回复
这时数组里只有a[0]= -5 但是这个时候递归开始返回上一层 所以不会再执行 f=diguimax(a+1,n-1); 而是回到6 ,-5的时候 [/quote] ------------------------------------- 不再执行diguimax(a+1,n-1)语句了。哦,是这样的啊。 当时俺就是这一点糊涂,俺当时是死扣这个diguimax(a+1,n-1)中的“a+1”变化呢。 原来不在执行diguimax(a+1,n-1);
zhangyuan850 2016-11-10
  • 打赏
  • 举报
回复
当n==1时,递归返回值,此时返回值为a[0]==-5,然后f=diguimax(a+1,n-1);,则f= -5,这个俺理解是返回的a[0]= -5给了f, 但是这个时候a[0]又变成a[0]=6,这个值怎么得来的?谢谢[/quote] 当n==1时,递归返回值,此时返回值为a[0]==-5 这时候数组是 {-5} 但是这个时候a[0]又变成a[0]=6, 这时候数组已经是{6,-5}了,此a非彼a,在递归的每一层里 ,a都是不同的,虽然名字一样 {7,29,36,28,6,-5} {29,36,28,6,-5} {36,28,6,-5} {28,6,-5} {6,-5} {-5} 先从上递归到最下面,然后逐层返回[/quote] ----------------------------------------------------------------- 先从上递归到最下面,,变成{-5}这个俺理解,就是然后逐层返回,由{-5}变成{6,-5}不理解。 先从上递归到最下面是根据diguimax(a+1,n-1)中的“a+1”指针变化得来的, 逐层返回根据那个语句?
stherix 2016-11-10
  • 打赏
  • 举报
回复
引用 5 楼 zhangyuan850 的回复:
if (n==1) {    /* cout<<"n==1"<<endl; (1)*/    /* cout<<"n==1,a[0]="<<a[0]<<endl; (2)*/ return a[0]; } 这个时候,递归结束返回:a[0]= -5, 到了这步: f=diguimax(a+1,n-1); f= -5, 这时数组里只有a[0]= -5, 指针"a+1"指向哪?
这时数组里只有a[0]= -5 但是这个时候递归开始返回上一层 所以不会再执行 f=diguimax(a+1,n-1); 而是回到6 ,-5的时候
zhangyuan850 2016-11-10
  • 打赏
  • 举报
回复
if (n==1) {    /* cout<<"n==1"<<endl; (1)*/    /* cout<<"n==1,a[0]="<<a[0]<<endl; (2)*/ return a[0]; } 这个时候,递归结束返回:a[0]= -5, 到了这步: f=diguimax(a+1,n-1); f= -5, 这时数组里只有a[0]= -5, 指针"a+1"指向哪?
stherix 2016-11-10
  • 打赏
  • 举报
回复
f=diguimax(a+1,n-1); 你注意到这一条,每次递归,他都把首地址往后移1位的新地址 作为子数组传到下一层递归里去
stherix 2016-11-10
  • 打赏
  • 举报
回复
引用 2 楼 zhangyuan850 的回复:
[quote=引用 1 楼 stherix 的回复:] 首先你要知道 递归是不会无限递归的 在满足一定的条件下 ,递归会返回 这样才能获得结果 这个递归 ,就是找 当前数组 (第一个数值) 和 (除了第一个数以外所有数的最大值) 之间的最大者 (除了第一个数以外所有数的最大值) 就是递归调用这个函数了 当递归到子数组只有1个数字的时候,这个数组的的最大值自然就是这个数字 然后递归开始逐层返回,每次都是2个数字取较大者 最后得到整个数组的最大值
--------------------------------------------------- 当n==1时,递归返回值,此时返回值为a[0]==-5,然后f=diguimax(a+1,n-1);,则f= -5,这个俺理解是返回的a[0]= -5给了f, 但是这个时候a[0]又变成a[0]=6,这个值怎么得来的?谢谢[/quote] 当n==1时,递归返回值,此时返回值为a[0]==-5 这时候数组是 {-5} 但是这个时候a[0]又变成a[0]=6, 这时候数组已经是{6,-5}了,此a非彼a,在递归的每一层里 ,a都是不同的,虽然名字一样 {7,29,36,28,6,-5} {29,36,28,6,-5} {36,28,6,-5} {28,6,-5} {6,-5} {-5} 先从上递归到最下面,然后逐层返回
zhangyuan850 2016-11-10
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
首先你要知道 递归是不会无限递归的 在满足一定的条件下 ,递归会返回 这样才能获得结果 这个递归 ,就是找 当前数组 (第一个数值) 和 (除了第一个数以外所有数的最大值) 之间的最大者 (除了第一个数以外所有数的最大值) 就是递归调用这个函数了 当递归到子数组只有1个数字的时候,这个数组的的最大值自然就是这个数字 然后递归开始逐层返回,每次都是2个数字取较大者 最后得到整个数组的最大值
--------------------------------------------------- 当n==1时,递归返回值,此时返回值为a[0]==-5,然后f=diguimax(a+1,n-1);,则f= -5,这个俺理解是返回的a[0]= -5给了f, 但是这个时候a[0]又变成a[0]=6,这个值怎么得来的?谢谢
stherix 2016-11-10
  • 打赏
  • 举报
回复
首先你要知道 递归是不会无限递归的 在满足一定的条件下 ,递归会返回 这样才能获得结果 这个递归 ,就是找 当前数组 (第一个数值) 和 (除了第一个数以外所有数的最大值) 之间的最大者 (除了第一个数以外所有数的最大值) 就是递归调用这个函数了 当递归到子数组只有1个数字的时候,这个数组的的最大值自然就是这个数字 然后递归开始逐层返回,每次都是2个数字取较大者 最后得到整个数组的最大值

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧