案例解说C语言递归函数

案例解说C语言递归函数C语言递归函数是指在函数的定义中使用函数自身的方法,也就是一个函数在它的函数体内调用它自身。这种函数称为递归函数。递归函数的特点是:- 存在限制

大家好,欢迎来到IT知识分享网。案例解说C语言递归函数"

C语言递归函数是指在函数的定义中使用函数自身的方法,也就是一个函数在它的函数体内调用它自身。这种函数称为递归函数。

递归函数的特点是:

– 存在限制条件,当符合这个条件时递归便不再继续。

– 每次递归调用之后越来越接近这个限制条件。

– 执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。

递归函数不是C语言的专利,Java、C#、JavaScript、PHP等其他编程语言也都支持递归函数。

递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列、汉诺塔问题等等。

下面我们通过一个求阶乘的例子,看看递归函数到底是如何运作的。

#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) = 120

factorial()就是一个典型的递归函数。调用factorial()后即进入函数体,只有当n==0或n==1时函数才会执行结束,否则就一直调用它自身。由于每次调用的实参为n-1,即把n-1的值赋给形参n,所以每次递归实参的值都减1,直到最后n-1的值为1时再作递归调用,形参n的值也为1,递归就终止了,会逐层退出。

要想理解递归函数,重点是理解它是如何逐层进入,又是如何逐层退出的。下面我们以5!为例进行讲解。

**递归的进入**

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. 以此类推,进行四次递归调用后,实参的值分别为3、2、1、0,形参n的值也相同。当实参为0时,形参n也为0,等于0或1,会执行return 1;语句,返回1。这就是第五次递归,也是最后一次递归。

**递归的退出**

4. 当第五次递归返回1后,第四次递归就可以继续执行了。第四次递归的表达式是factorial(1) * 2 ,由于factorial(1)已经返回了1,所以这个表达式的结果就是1 * 2 = 2 ,并返回给第三次递归。

5. 当第四次递归返回2后,第三次递归就可以继续执行了。第三次递归的表达式是factorial(2) * 3 ,由于factorial(2)已经返回了2,所以这个表达式的结果就是2 * 3 = 6 ,并返回给第二次递归。

6. 当第三次递归返回6后,第二次递归就可以继续执行了。第二次递归的表达式是factorial(3) * 4 ,由于factorial(3)已经返回了6,所以这个表达式的结果就是6 * 4 = 24 ,并返回给第一次递归。

7. 当第二次递归返回24后,第一次递归就可以继续执行了。第一次递归的表达式是factorial(4) * 5 ,由于factorial(4)已经返回了24,所以这个表达式的结果就是24 * 5 = 120 ,并返回给主函数。

8. 当第一次递归返回120后,主函数就可以继续执行了。主函数会把120赋值给factorial(a),并输出结果。

以上就是求阶乘的例子中,递归函数的进入和退出过程。通过这个例子,我们可以看到:

– 每一层都有自己独立的变量n和表达式factorial(n-1) * n ,它们不会相互干扰。

– 每一层都要等待下一层返回结果后才能继续执行。

– 最内层的函数最先结束,最外层的函数最后结束。

使用递归函数的注意事项:

– 递归函数必须有一个明确的终止条件,也就是递归的出口,否则会导致无限递归,造成栈溢出或者系统崩溃。

– 递归函数的效率通常比较低,因为它需要反复地调用自身,占用大量的栈空间和时间。因此,在能够用循环解决的问题上,尽量避免使用递归函数。

– 递归函数的参数应该有规律地变化,使得每次递归调用都能够向终止条件靠近。否则,递归函数可能陷入死循环,无法返回结果。

– 递归函数中如果使用了静态变量,那么在整个递归过程中,这个静态变量只会被分配一次内存空间,并且在每次递归调用中都会被修改。因此,在使用静态变量时要注意它的作用域和生命周期。

系列文章持续更新,如果觉得有帮助请点赞+关注!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/58913.html

(0)
上一篇 2024-05-07 20:26
下一篇 2024-05-10 09:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信