1 递归
递归含义:是在一个函数中又调用了自己 。
递归一般是和循环一起的,循环--->递归,但是递归不能转成循环
先引入一个例子: 求5! 当求5!时 等价于 5!=5*4! 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*0! 0!=1 (这个地方就是递归的出口)
用一个函数来代替它 比如 fact(5) = 5! 可知 fact(n)=n!
写递归函数时 要注意以下两点:
1 要找到递归的结束条件,也叫递归出口 比如这个阶乘的公式中 出口就是 0! 也就是等于1 或者是直接等于0
2 递归的调用公式 这个公式也可以很明了的看出 :fact ( n ) = n* fact ( n-1)
#include<iostream>
using namespace std;
int fact(int n)
{
if (n == 1 || n == 0)
{
return 1;
}
else
{
return n * fact(n - 1);
}
}
int main()
{
printf("5!=%d", fact(5));
return 0;
}
递归有两部分组成:
1,2,3,4,5,6 //后一项 = 前一项 + 1
f(n) = f(n-1) + 1 (这个叫递归关系) 和f(1) = 1;(这个叫递归出口)
1,3,5,7,9,11,13 //后一项 = 前一项 + 1
2,4,6,8,10,12,14
f(n) = f(n-1) + 2 (这个是递归关系)不管是奇数列还是偶数列 他们的递归关系都是前面的,所 以需要一个叫“递归出口”就是让f(1)= 数列刚开头的数 ,去判断他的奇偶数列
下面是一小个段代码块的例子 写代码的时候先写
递归出口
【函数套函数的例子】
int f(int n)//这个return 就是函数值返回函数本身的
{
if (n == 1)
{
return 1;//这个是递归出口
}
else
{
return f(n - 1) + 2;//这个是递归关系
}
}
2 例子 斐波那契数列
1 1 2 3 5 8 13 21
f(n) = f(n-1) + f(n - 2) 这个 数列要有两个出口 f(1) = 1 和 f(2) = 1
只有这样才可以 f(3) = f(1) + f(2)
//先写递归出口
int f(int n)
{
if (n == 1)//先写递归出口 这个有两个
{
return 1;
}
else if (n == 2)
{
return 1;
}
else {
return f(n-1) + f(n-2);//最后写递归关系
}
完整的代码
#include<stdio.h>
int f(int n)
{
if (n == 1)
{
return 1;
}
else if (n == 2)
{
return 1;
}
else
return (f(n - 1) + f(n-2));
}
int main()
{
int num = f(6);
printf("%d", num);
return 0;
}