鱼C论坛

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

C递归 我转晕了 求解

[复制链接]
发表于 2016-12-17 17:02:32 | 显示全部楼层 |阅读模式

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

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

x
int f(int n)
{
        if(n == 1 || n == 2)
        {
                return 1;
        }
        return f(n-1)+f(n-2);
}

int main()
{
        int a = 0;
        a = f(6);
        printf("%d",a);
        return 0;
}


返回值是  8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-17 20:53:19 | 显示全部楼层
return f(5)+f(4)
return f(4)+f(3)+f(3)+f(2)
return f(3)+f(2)+f(2)+f(1)+f(2)+f(1)+1
return f(2)+f(1)+1+1+1+1+1+1
return 8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-17 20:56:56 | 显示全部楼层
本帖最后由 zealstar 于 2016-12-17 20:58 编辑

我也略晕……

先分析这个f()这个宏
表达式 return f(n-1) + f(n-2)是最关键的东西,仔细看:
当n=1时返回 1
当n=2时返回 1
当n=3时返回 f(2)+f(1)=2
当n=4时返回 f(3)+f(2)=2+1=3
当n=5时返回 f(4)+f(3)=3+2=5
当n=6时返回 f(5)+f(4)=5+3=8

这样明白了吗?所谓递归,一般来说,就是用前一次,或者前n次的结果来进行各种计算得出最近一次的结果。这里除了第1次和第2次特殊以外,其他数字都是n因为只有n=1或者n=2时返回1。

还是汉诺塔,所谓n个环的汉诺塔,你需要的只是把n-1个环当成一个环来看,就好了。
虽然我也很不明白各种递归,但是你只要实际代入数字,你大概就会明白了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 17:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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