马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
# include <stdio.h>
int max (int x)
{
if (x == 1)
{
return 1;
}
else
{
return x + max (x - 1);
}
}
int main (void)
{
int m=100;
m = max (m);
printf ("%d",m);
return 0;
}
那么问题来了, 在函数 max 里面的 return x +max (x - 1) 这个时候100传参过来,那么X不应该是100么?我理解的是 return 100 + 100-1 = 100 + 99 =199 啊,那么第二次函数调用自己本身不是 199 + 199-1了?真是没明白return 的过程,现在只知道递归要这样打,至于为什么是这样打,懵逼,出口那个 return 1也是懵的,return 不是跳出函数了吗,1返回的是什么结果?返回结果5050是对的,但是,哎就是不明白这个递归执行的过程
请高手解答一下,现在是明白了递归的算法,但是这个执行过程怎么想都不明白,搞我现在就理解成 那个 return x = 计数 x-1 = 100 - 1 减到 == 1的时候,X计数也到了 99 然后又往回加?但是减到 x == 1 的时候遇到 return 1 不是跳出函数了么,就返回一个1而已啊,不明白,不明白!
本帖最后由 micolar 于 2019-8-24 08:06 编辑
假如m == 5
你那程序执行到
m = max(m)
它就跳到max(5)函数
它过程中还要调用别的函数 也就是max(m-1) max(4)
执行max(4)函数 注意max(5) 跟 max(4) 是两个函数 不属于同个函数 它们都有各自的返回值 max(5)返回 15 max(4)返回10
依次类推
max(3)
max(2)
max(1) 这个函数因为参数等于1 它直接返回1 不再调用其它函数 然后把返回值1交给函数max(2) ,max(1)函数结束
max(2) = 2 +1 把返回值3交给max(3) max(2)函数结束 依次类推
max(3) = 3+3
max(4) = 4 + 6
max(5)= 5 + 10 这个时候max(5)结束 才执行下满printf("%d",m);语句
因为m = max(5) 所以m的结果是15 max(1)的值是给max(2)用的
还要 你上面的x是局部变量 仅在本函数有效 简单说 max(m) 跟 max(m-1) 函数中的x是两个不同的x
我理解的是 return 100 + 100-1 = 100 + 99 =199 啊,那么第二次函数调用自己本身不是 199 + 199-1了?
return 100 + max(100-1) 不是 return 100 + 100-1 = 100 + 99 =199
严格来说它不是调用自身 他们都有各自的栈 也就是内存
当然你也可以理解调用自身
|