鱼C论坛

 找回密码
 立即注册
查看: 1491|回复: 2

[已解决]C语言的递归问题,我晕了

[复制链接]
发表于 2019-8-24 01:27:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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而已啊,不明白,不明白!
最佳答案
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)返回 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
严格来说它不是调用自身 他们都有各自的栈 也就是内存
当然你也可以理解调用自身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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)返回 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
严格来说它不是调用自身 他们都有各自的栈 也就是内存
当然你也可以理解调用自身

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
迷雾少年 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-8-24 11:17:28 | 显示全部楼层
好像理解了80%,再上机试试,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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