小小麦兜兜 发表于 2019-8-24 01:27:16

C语言的递归问题,我晕了

# 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 07:57:12

本帖最后由 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)返回 15max(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的结果是15max(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
严格来说它不是调用自身 他们都有各自的栈 也就是内存
当然你也可以理解调用自身

小小麦兜兜 发表于 2019-8-24 11:17:28

好像理解了80%,再上机试试,谢谢
页: [1]
查看完整版本: C语言的递归问题,我晕了