鱼C论坛

 找回密码
 立即注册
查看: 3231|回复: 7

请各位解释下递归.

 关闭 [复制链接]
发表于 2011-5-25 00:22:42 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 小霜 于 2011-5-29 00:15 编辑

#include <stdio.h>

long ff(int n)
{
        long f=0;

        if(n<0)
        {
                printf("INput Error");
        }
        else if(n==0 || n == 1)
        {
                f = 1;
        }
        else
        {
                f = ff(n-1)*n;
        }
        return f;
}
main()
{
        int n=0;
        long y=0;
        printf("INout a number:\n");
        scanf("%d",&n);
        y = ff(n);
        printf("%d!=%ld\n",n,y);
}

到底那个 ff 函数怎样看啊?我看来看去看不懂,谁能解释下.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-25 09:32:04 | 显示全部楼层
本帖最后由 asd82937121 于 2011-5-25 09:33 编辑

递归  很简单 就是自己调用自己, 这个函数作用是干嘛的  ??? 首先你要能看懂数据类型 , 那么很明显 ff名字前面有个long  就是长整形 ,至于为什么是长整形  请看甲鱼哥的视频  从零开始学C语言
ff函数会产生一个返回值  这个返回值的数据类型是一个长整形, 同时这个函数还需要一个有符号的整形数据当做形参,那么  既然它吃什么和拉什么我们都知道了  就看肚子里是什么货就好了
两个{} 代表了函数里的内容,那么我们就一行一行的来看,首先定义一个长整形数据,这个就不用我说了吧,然后是if。。。 else if  和else  那么这个分支结构是什么意思  是干嘛的呢?  翻译过来就是  如果 。。。但是如果,。。。但是。。。
那么剩下来的工作就简单了  仔细读一下函数   如果N小于0  好  输出那里边的一个语句,但是如果n要是等于0或者1  就输出那里边的。。。 但是。。。 以此类推
可能到这里你还是不明白递归的调用, 那好  用一个最简单的办法  请你再写一个函数, 函数的内容和ff是一摸一样的  记住  是一摸一样的  名字叫做ff2  那么你把原函数中的ff()函数都换成ff2()  理解了么?
函数的递归就像自己循环一样,吃什么拉什么拉什么再自己吃(恶心。。。),每一次循环都会消化一点东西 ,一直到你拉出来的满足你的要求了  。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-25 09:57:55 | 显示全部楼层
回答的太精彩了。哈哈,笑死我了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-25 11:56:12 From FishC Mobile | 显示全部楼层
上边的哥们很用心并很幽默地回答了!

我就说下思路吧:正所谓递归的思想就是归去来兮!其实很多朋友包括小甲鱼个人刚开始觉得递回难主要是思考的方向上的问题。只要从思想上有了突破,哥们会发觉递回远比迭代要容易思考。
平时我们习惯了思考问题的方式是从上往下从前往后地去想,但递回确是要相反:递回需要先想思考最终成立的条件,再逐步返回……请结合小例子自行研究下两者的方法。

另外,小甲鱼提个问题让哥们思考下:就是在什么情况下我们非用递回不可?!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-25 13:38:09 | 显示全部楼层
谢谢asd82937121的回答.不过这些我已经明白..只不过我看不懂一个东西,就是那个 f = ff(n-1)*n; 。首先相续的- 1 .直到 n 减到 1.就变成了 f = 1. 然后开始归来. 根据调试. f = 1 . n = 1 . 然后 n 的值 变成 了2 . f 也等于2 . 然后 n = 3 . 那 f 就等于 6 . 相等于 f*n . 可是
f = ff(n - 1 ) * n 不是 等于 n-1 再乘 n 吗 ~ 怎么是f 直接乘n 了~~

如果不明白我说的问题,那没关系吧。。自己想想可能就会了~
另外. 当 递归 归来的时候. 那个 ff(n- 1)*n 我用调试看了一下,它不用再执行 ff 的函数.就直接拿来乘了. 所有递归都是递的时候就执行函数.到了归来就不用执行了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-25 13:42:48 | 显示全部楼层

也就是老师说的汉诺塔 咯~~ 另外,递归 基本的思想就是把较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,进而获得原来问题的解啊~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-25 14:29:45 | 显示全部楼层
小霜 发表于 2011-5-25 13:38
谢谢asd82937121的回答.不过这些我已经明白..只不过我看不懂一个东西,就是那个 f = ff(n-1)*n; 。首先相续 ...

你确定你还没想明白??
这个程序的意思是当n=1或者0的时候才会有返回值,那么我们用数学公式推导一下就好啦 很简单的
条件:ff(1)==1    ff(0)==1
搜噶  :  如果你形参的值是5
哪嘛  你吧5代进去  会得出神马?
ff(5)=ff(4)*5....  ff(4)的值不知道?  不知道就不鸟他
这一步你明白了不???
如果你明白了  那就OK了

ff(5)=ff(4)*5
ff(4)=ff(3)*4
ff(3)=ff(2)*3
ff(2)=ff(1)*2

搜第四内   
这不是初中数学嘛
ff(5)=ff(1)*2*3*4*5     结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-29 00:13:54 | 显示全部楼层
谢谢了,大概明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-20 06:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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