1.什么是递归
所谓递归就是函数在内部中自己调用自己。把一个大的问题转化成一个个小问题来解决,即大事化小事
话说简单,可我们要如何去理解这一个问题呢?首先我们要明白递归的含义是:递归中的递——递推 ,就是要我们从计算开始一步一步的递推回到它的第一个数, 递归中的归——回归,那就是把已经计算好的结果又一步一步返回到它要计算的数里。其次,要寻找递归的限制条件是什么
2.递归的限制条件
@我们要明白所用的函数是用来干什么的
@当递推到满足条件的时候,递归就停止继续。如果这个条件不满足,它就会一直在自己调用自己,形成类似于无限循环似的,永远都在自己调用自己的状态,
@每次递归调用之后不断缩小参数范围,
3.递归
(1)示例:求n的阶乘
n的阶乘递归公式:
假设fat(n)就是求n的阶乘,那么fat(n-1)就是求n-1的阶乘
#include<stdio.h>
int fat(int a) {
if (a == 0)
//停下来的条件
return 1;
else
return a * fat(a - 1);
}
int main() {
int n = 0;
scanf("%d",&n);
int ret = fat(n);
printf("%d\n", ret);
return 0;
}
画图解释
运行结果
(2)示例:顺序打印一个整数的每一位
输入:1234 输出:1 2 3 4
#include<stdio.h>
void print(int a) {
if (a > 9) {
print(a / 10);
}
printf("%d", a % 10);
}
int main() {
int n = 0;
scanf("%d", &n);
print(n);
}
画图解释
运行结果
3.递归与迭代.
每一次对过程的重复称为一次“迭代”,(循环也是迭代的一种方式)而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。
示例:1:计算n的阶乘,可以产生1~n的数字累计乘在一起的(用迭代的方式来求)
int Fact(int n) {
int i = 0;
int ret = 1;
for (i = 1; i <= n; i++) {
ret *= i;
}return ret;
}
int main() {
int a;
scanf("%d", &a);
int av=Fact(a);
printf("%d\n", av);
return 0;
}
运行结果
许多问题是以递归的形式进行解释,那是因为它比非递归(迭代
)的形式更加清晰,但这些问题的迭代实现往往比递归实现效率更高。
示例2:斐波那契数列(方法:迭代)
斐波那契数列(Fibonacci Sequence)又称黄金分割数列。该数列指的是这样的一列数字:0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368…
特别指出:第0项是0,第1项是第一个1。此数列从第2项开始,每一项都等于前两项之和。
#include<stdio.h>
int Fib(int n) {
int a = 1;
int b = 1;
int c = 0;
while (n>=3) {
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main() {
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
运行结果