天天看点

C语言函数递归

C语言函数递归

递归概念

在C语言中,函数调用可以从main()函数,其他函数或同一函数本身进行。递归函数定义如下:一个函数调用函数自身称为递归函数。应该非常小心地使用递归函数,因为当一个函数自己调用它进入无限循环时。当函数进入无限循环时,函数执行永远不会完成。我们应该定义退出函数调用的条件,以便递归函数终止。当一个函数被自己调用时,第一个调用仍在执行中,直到调用最后一个调用。每次调用函数调用时,该函数都会将执行控件返回到上一个函数调用。举个 栗子 ,你用你手中的钥匙打开一扇门,结果却发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门...但是当你开到某扇门时,发现前方是一堵墙无路可走了,你选择原路返回——这就是递归,如下图即使是递归。

C语言函数递归

阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。

C语言函数递归

可以看到,return fact_iter(n- 1, n* result)仅返回递归函数本身,n- 1和n* result在函数调用前就会被计算,不影响函数调用。尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。

C语言函数递归

尾言

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。