递归是一种解决问题的方法,它是指一个函数直接或间接地调用自身来解决一些复杂的问题。
一、递归思想
递,是递推,归,是回归,其基本思想是将一个大问题分解为若干个小问题,每个小问题都可以独立解决,然后通过解决这些小问题来间接地解决大问题。其优点在于它可以将复杂的问题简化,使得代码更加简洁、易于理解和维护。但是,递归也存在着一些缺点,例如可能会占用大量的系统资源,特别是对于一些递归深度过大的问题,可能会导致系统崩溃。如下列代码:
#include <stdio.h>
int main()
{
printf("hahaha\n");
main(); //main函数中⼜调⽤了main函数
return 0;
}
main函数中调用了main函数,使得程序不断递归,随着递归层次的深入,程序运行就可能会出现堆栈溢出。
二、限制条件
对于递归,我们必须有一个明确的终止条件,这是防止函数无限循环下去的关键。如果没有这个终止条件,函数会无尽地调用自身,导致程序崩溃。其在使用时必须要有以下两个必要条件:
- 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后越来越接近这个限制条件。
三、实例分析
(1)求n的阶乘(不考虑溢出)
阶乘公式:n!=(n-1)!* n
分析过程:
5!=4!* 5
4!= 3!* 4
3!= 2!* 3
2!= 1!* 2
将一个求比较大的数的阶乘转换为求一个小的数的阶乘(大问题分解一个与其相似的小问题)
n的阶乘的递归公式如下:
实现代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Fact(int n) {
// 递归函数
if (n <= 0)
return 1;
else
return n * Fact(n -