鱼C论坛

 找回密码
 立即注册
查看: 1643|回复: 6

关于递归和程序运行的理解问题

[复制链接]
头像被屏蔽
发表于 2015-3-3 14:44:16 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-3 14:44:17 | 显示全部楼层
大概看了下,你这是个计算阶乘的程序;
1、 值一直放在  temp_result中,temp_result=1设定了原值;
2、运行几次,取决于temp_result什么时候等于1,就停下来;
3、return temp_result重新运行一遍,实际上它只进行了一次计算(小甲鱼说的,归去来兮),值同上;
4、可以,temp_result一直在进行压栈操作;
以上都是个人理解,C语言也是初学难免有错,请路过的大神们给予指证,谢谢;

评分

参与人数 1荣誉 +1 鱼币 +5 贡献 +1 收起 理由
policewj + 1 + 5 + 1

查看全部评分

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

使用道具 举报

发表于 2015-3-3 15:20:17 | 显示全部楼层
#include<stdio.h>

int js(int i);

int main()
{
        int i;
        printf("Please Input a number:");
        scanf("%d",&i);
        printf("%d! = %d\n",i,js(i));

        return 0;
}

int js(int i) //计算阶乘的递归函数
{
        if(1 == i) 
        {
                return 1;
        }
        else
        {
                return i * js(i-1);//比如输入的是2 就返回 2 * js(1)   js(1) 应为1 == 1 所以 js(1) == 1  所以 js(2) == 2 * js(1) == 2 * 1 = 2
        }
}
//同理 js(3) == 3 * js(2) == 3 * 2 * js(1) == 3 * 2 * 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
 楼主| 发表于 2015-3-5 07:07:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-3-7 18:43:49 | 显示全部楼层
如果逻辑实在看不清楚的话,那就反汇编一下! 再看一下它的逻辑,就清楚了!

评分

参与人数 1鱼币 +1 贡献 +1 收起 理由
policewj + 1 + 1

查看全部评分

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

使用道具 举报

发表于 2015-3-7 20:20:41 | 显示全部楼层
递归,本质上说是一种思想。中学生的数学课本里常常用递归定义一些概念。
C语言只是用一种文本方式表达了递归这种思想。所以,如果你不知道这种思想,就肯定不可能在C语言中运用好(即使知道了,也未必运用得好)。
小学生。。。如果你还在学算术。。。还没开始学真的数学,就不大可能明白这种思想。事实上,就算正统的小学的数学也是连证明都没有。。。也不大可能明白这种思想。

评分

参与人数 1鱼币 +1 贡献 +1 收起 理由
policewj + 1 + 1

查看全部评分

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

使用道具 举报

发表于 2015-4-4 17:32:38 | 显示全部楼层
楼主是小学生啊,佩服佩服,我用尽量浅显的道理解释下递归,不懂还可以继续交流:

递归是一项非常重要的编程技巧,它使函数调用其本身。示例之一就是阶乘的计算。0 的阶乘被明确地定义为 1。n(大于 0 的整数)的阶乘是 1 到 n 之间所有整数的乘积。

以下段落是用文字定义的一个阶乘计算函数。

如果数字小于零,则将其拒绝。如果数字不是整数,则将其拒绝。如果数字为零,其阶乘则为一。如果数字大于零,则将其乘以下一个更小数字的阶乘。
若要计算任一个大于零的数字的阶乘,必须至少计算另外一个数字的阶乘。函数在对当前数字执行计算之前,必须先对小于当前数字的相邻数字调用其自身。这就是递归的示例。

递归和迭代(循环)密切相关,即函数可以使用递归或迭代返回相同的结果。通常,某个计算适用于一种技巧或另一种技巧,您只须选择最自然或最理想的方法。

虽然递归的用处很大,但是如果使用不慎,创建的递归函数就可能从不返回结果并且不能到达终点。这种递归导致计算机执行“无限”循环。下面是一个示例:忽略阶乘计算文字描述中的第一项规则(有关负数的规则),然后计算任意负数的阶乘。这种计算失败的原因是:若要计算 -24 的阶乘,必须计算 -25 的阶乘,要计算 -25 的阶乘,必须先计算 -26 的阶乘,依此类推。显然,这种计算永远得不出结果。

递归可能出现的另一个问题是:递归函数可能用尽所有可用的资源(如系统内存、堆栈空间等等)。每次递归函数调用自身(或调用另一个函数,而另一个函数又调用原来的函数),递归函数就会占用一些资源。当递归函数退出时,就会释放这些资源,但是函数的递归层次过多,就会用尽所有可用的资源。发生这种情况时,就会引发异常。

因此,谨慎设计递归函数是非常重要的。如果怀疑可能出现递归过多(或无限递归)的情况,则设计函数时就应加入计算函数调用其自身的次数的功能,并设置调用次数限制。如果函数调用自身的次数超过阈值,则函数可以自动退出。迭代的最大次数的最佳取值取决于递归函数

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
policewj + 5 + 5 + 3

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 21:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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