C语言的函数调用是递归吗?

C语言的函数调用是递归吗?,第1张

递归”外在表现出来的形式,是:函数自己调用自己。也就是说:如果我们定义了一个函数fun(),那么,在fun函数体中,fun这个函数自己调用自身 ,这就是表示:递归调用。

我们来看一下,下面这个程序段:

上述C语言程序中,第7行到第10行,就是使用“循环”的方式,来实现从0一直累加到100的和。大部分情况下,“循环”与“递归”之间,都可以相互转换。

​在使用递归的时候,需要注意以下两点:

需要有一个“递归出口”,如果没有一个出口,那么递归就会一直执行下去,一直到将“栈空间”占满为止。那时程序就会崩溃,所以一定是要有一个“递归出口”。

如果所要执行的次数比较多,可以尽量选择用“循环”的方式,因为使用“递归”的方式,程序执行的速度会比较慢。

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。

简单的说 递归就是函数的内部自己调用自己,这个函数就是递归函数。

递归函数不断的一遍又一遍的调用自己,效果类似于循环,同样也和循环有一样的特点,那就是怕死循环。

在递归中叫"栈溢出"错误(stack overflow),所以必须要加退出条件 return。

再来个栗子:

刚开始的我会把fn(n-1)这里写成 n+1 想当然的觉得 1 2 或者 2 3 这样的不也是一样吗 但是执行完发现显示的是栈溢出

到这我才发现我还是不理解递归的返回条件

于是我自己分析了一下:

发现了吗 没有条件的中断与返回 自己觉得就是求一下3的阶乘 但实际求的是从3开始的和3++的阶乘

而写成n-1 求的是从3开始 与3--的阶乘 一直求到有一个中断条件 n==1 返回了1为止

这样的话 可以在上限加一个中断返回值

这样的话 算的就是从2到5的阶乘结果是和n-1那个 fn(5)的值是一样的 值都是120

那么说到递归就自然而然的要说到斐波那契数列(兔子序列)了:

简单的说就是前两项相加的值等于后面那个数的值

1、1、2、3、5、8、13、21

要求:用户输入一个数字n就可以求出 这个数字对应的兔子序列的值

于是 自恃天才的我 想到了为什么不直接写

renturn fn(n-1)+fn(n)呢?

我输出了一下 又是栈溢出!

现实是啪啪的打脸 玛德制杖 自己推算一下 搜戴斯内

fn(3)算个没完没了 我们并没有终结它

在这里我用自己的语言 浅显的、简单的总结一下 正确的递归 要有初始值 还要明确结束值 递归的方向也要清楚

递归的方向就是中断的条件 就是结束值的方向 朝着中断的条件总不会错

就如同X轴 Y轴的折线图一样

比如上面那个阶乘 我的nfn(n+1)的错误在于没有弄清楚方向 让它一直走一个向上的箭头 向上还没有封顶 它自然会栈溢出 。

再比如刚才这个斐波那契数列 我是让它在X轴水平向右无限延伸 水平方向我也没有设置中断 它也会栈溢出

但愿今晚的两杯酒饮料不至于让我在这说胡话 [苦笑]

对的。。他是个死循环,只是他每隔1秒执行一次,javascript他的这个就有点像我们程序的线程一样,彼此不影响,在自身掉用的时候他确实是会把所有代码都执行一遍

对于你补充的问题。

身调用的windowsetTimeout("ShowTime()",1000)这句代码放在函数的任何地方都一样的效果

这个只要放在ShowTime()这个方法后面都能执行,前提是要写在<script></script>之间

希望你能满意,如有疑问可以给我发消息

错,函数可以调用自己,函数自己调用自己的这种调用方式称为函数的递归调用,我给你举个列子:

int calc(int num){

if(num==0){

return 0;

}else{

return numcalc(num-1);

}

}

这个函数就是利用递归求任意一个整数的阶乘

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12163128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存