综述
在调用一个函数的过程中又出现直接或者间接地调用函数本身,称为函数的di'g
递归是和循环联系起来的
recursion和loop可以相互转化,递归不一定可以转为循环
例子1
1,2,3,4,5,...
写成递归必须要有规律
例子2
1 3 5 7 9 11 13...和2 4 6 8 10...
的递归关系式均为f(n)=f(n-1)+2
f(1)=1
就需要一个出口
写成代码,先写出口
int f(int n){
if(n==1) return 1;
else return f(n-1)+2;
}//先写递归出口
例子3
Fibonacci
1 1 2 3 5 8 13 21
f(n)=f(n-1)+f(n-2)
必须要有两项递归出口
f(1)=1,f(2)=1
代码
int f(int n){
if(n==1) return 1;
else if(n==2) return 1;
else return f(n-1)+f(n-2;)
}
验证:递归是一个函数,不要把它放进main函数,要调用
#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);
}
结果
例子4
求 1+2+3+...+100
f(n)=1+2+3+4+...+n
把f(n)分为两部分
f(n)=f(n-1)+n;
f(1)=1;
代码
#include<stdio.h>
int sum(int n){
if(n==1){
return 1;
}
else return sum(n-1)+n;
}
int main(){
int num=sum(100);
printf("%d",num);
}
例子5
代码
#include<stdio.h>
int sum(int arr[],int n){ //第一个参数是一个数组
if(n==0){
return arr[0];
}
else
return sum(arr,n-1)+arr[n];}// return sum(arr[],n-1)+arr[n]这种是错误的
int main()
{
int arr[]={1,7,8,6,4,7,3};
int s=sum(arr,4);// int s=sum(arr[],4);是错误的 ,这是前面5项的和
printf("%d",s);
return 0;
}
例子6
(在做递归时,是把一个大的东西变为两个小东西)
求数组中的最大值
要知道n项的最大值,就要知道前n-1项的最大值
代码
//递归求数组最大值
#include<stdio.h>
int max(int arr[],int n)
{
if(n==0)
return arr[0];
else
{
if(max(arr,n-1)>arr[n])
return max(arr,n-1);
else
return arr[n];//函数返回到引用它的位置
}
}
int main()
{
int a[]={10,11,12,1,100,20,30},m=5;
int max1=max(a,m);
printf("%d",max1);
return 0;
}
后记
例子5中代码注释还没理解