1. 何为递归
递归是函数自己调用自己。
如:
这是递归的基本形式,不过是死递归,导致栈溢出。
1.1 递归思想:
递归,递指递推,归指回归。
把一个大型复杂问题逐层转化为与原问题相似但规模较小的子问题,直至子问题不能被拆分,递归才算结束,是一个将大事化小的过程。
1.2 递归限制条件:
1)递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。
2)每次递归调⽤之后越来越接近这个限制条件。
2. 递归例子
每次函数调用都会向栈区申请一块空间(称作运行时堆栈或者函数栈帧),用于存放调用函数过程中的相关信息。
例1:求n的阶乘!
分析:
1!=1
2!=2*1=2*1!
3!=3*2*1=3*2!
...
n!=n(n-1)!
实现:
#include<stdio.h>
int count(int n)
{
if(n==0)
return 1;
else
return n*count(n-1);
}
int main()
{
int n=0;
scanf("%d",&n);
int s=count(n);
printf("%d\n",s);
return 0;
}
n>0时,求n的阶乘转化成n乘(n-1)的阶乘,以此类推,直到n=0时结束。
例2:输入一个整数,按照顺序打印每一位数。
输入1234 打印 1 2 3 4
分析:
1234%10 4
1234/10=123
123%10 3
1233/10=12
12%10 2
12/10=1
1%10 1
实现:
#include<stdio.h>
void print(int n)
{
if (n > 9 )
print(n/10);
printf("%d ", n % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
print(n);
return 0;
}
例3:求第n给斐波那契数。
分析:
1 1 2 3 5 8 13 ······
#include<stdio.h>
int Fib(int n)
{
if (n > 2)
return Fib(n-1)+Fib(n-2);
else
return 1;
}
int main()
{
int n = 0;
scanf("%d", &n);
int r=Fib(n);
printf("%d ", r);
return 0;
}