购物网站用模板好不好,平度做网站公司,做一个公司展示型网站多少钱,太原seo一个函数在它的函数体内调用它自身称为递归调用#xff0c;这种函数称为递归函数。执行递归函数将反复调用其自身#xff0c;每调用一次就进入新的一层#xff0c;当最内层的函数执行完毕后#xff0c;再一层一层地由里到外退出。 递归函数不是C语言的专利#xff0c;Java…一个函数在它的函数体内调用它自身称为递归调用这种函数称为递归函数。执行递归函数将反复调用其自身每调用一次就进入新的一层当最内层的函数执行完毕后再一层一层地由里到外退出。 递归函数不是C语言的专利Java、C#、JavaScript、PHP 等其他编程语言也都支持递归函数。我们通过一个求阶乘的例子看看递归函数到底是如何运作的。阶乘 n! 的计算公式如下
根据公式编写如下的代码
#include stdio.h//求n的阶乘
long factorial(int n) {if (n 0 || n 1) {return 1;}else {return factorial(n - 1) * n; // 递归调用}
}int main() {int a;printf(Input a number: );scanf(%d, a);printf(Factorial(%d) %ld\n, a, factorial(a));return 0;
}运行结果
Input a number: 5↙
Factorial(5) 120factorial() 就是一个典型的递归函数。调用 factorial() 后即进入函数体只有当 n0 或 n1 时函数才会执行结束否则就一直调用它自身。
由于每次调用的实参为 n-1即把 n-1 的值赋给形参 n所以每次递归实参的值都减 1直到最后 n-1 的值为 1 时再作递归调用形参 n 的值也为1递归就终止了会逐层退出。
递归的进入
1 . 求 5!即调用 factorial(5)。当进入 factorial() 函数体后由于形参 n 的值为 5不等于 0 或 1所以执行factorial(n-1) * n也即执行factorial(4) * 5。为了求得这个表达式的结果必须先调用 factorial(4)并暂停其他操作。换句话说在得到 factorial(4) 的结果之前不能进行其他操作。这就是第一次递归。
2 . 调用 factorial(4) 时实参为 4形参 n 也为 4不等于 0 或 1会继续执行factorial(n-1) * n也即执行factorial(3) * 4。为了求得这个表达式的结果又必须先调用 factorial(3)。这就是第二次递归。
3 . 以此类推进行四次递归调用后实参的值为 1会调用 factorial(1)。此时能够直接得到常量 1 的值并把结果 return就不需要再次调用 factorial() 函数了递归就结束了。
我们通过下图来深入理解递归逐层进入的过程
递归的退出
当递归进入到最内层的时候递归就结束了就开始逐层退出了也就是逐层执行 return 语句。
1 . n 的值为 1 时达到最内层此时 return 出去的结果为 1也即 factorial(1) 的调用结果为 1。
2 . 有了 factorial(1) 的结果就可以返回上一层计算factorial(1) * 2的值了。此时得到的值为 2return 出去的结果也为 2也即 factorial(2) 的调用结果为 2。
3 . 以此类推当得到 factorial(4) 的调用结果后就可以返回最顶层。经计算factorial(4) 的结果为 24那么表达式factorial(4) * 5的结果为 120此时 return 得到的结果也为 120也即 factorial(5) 的调用结果为 120这样就得到了 5! 的值。
我们通过下图来深入理解递归逐层退出的过程
递归的条件
每一个递归函数都应该只进行有限次的递归调用否则它就会进入死胡同永远也不能退出了这样的程序是没有意义的。
要想让递归函数逐层进入再逐层退出需要解决两个方面的问题 存在限制条件当符合这个条件时递归便不再继续。对于 factorial()当形参 n 等于 0 或 1 时递归就结束了。每次递归调用之后越来越接近这个限制条件。对于 factorial()每次递归调用的实参为 n - 1这会使得形参 n 的值逐渐减小越来越趋近于 1 或 0。如果感觉不错的话请点赞哟