递归
如图 每一项都是前面一项+1
可以发现f(n)=f(n-1)+1 关系
f(1)=1 出口
再看一个例子
这两个数列的关系都是f(n)=f(n-1)+1
所以需要一个递归出口
怎么把它写成代码呢
返回值是int 参数是下标 写成代码:
int f(int n)
{
//递归出口
if(n==1)
{
return 1;
}
else{
//递归关系
return f(n-1)+2;
}
}
fibonacci数列
要有两个递归出口
因为至少两个一才能确定第三个数
int f(int n)
{
if(n==1||n==2)
{
return 1;
}else
{
return f(n-1)+f(n-2);
}
}
数组求和
int arr[]={1,2,3,4,5};
sum(arr,n)//求数组的前n项=sum(arr,n-1)+arr[n]
递归出口 sum(arr,0);
int sum(int arr[],int n)
{
if(n==0)
{
return arr[0];
}
else{
return sum(arr,n-1)+arr[n];
}
}
所有循环都可以转换成递归
#include <stdio.h>
int findmax(int arr[],int n)
{
int max=arr[0];
int i;
for(i=0;i<n;i++)
{
if(arr[i]>max)
{
max=arr[i];
}
}
return max;
}
int findmax(int arr[],int L,int R)
{
if(L==R)
{
return arr[L];
}
else
{
int a=arr[L];
int b=findmax(arr,L+1,R);
if(a>b)
{
return a;
}
else
{
return b;
}
}
}
int main()
{
int arr[10]={8,2,3,4,6,5,1,10,9,7};
int m=findmax(arr,0,9);
}
L与其他数字比较
递归出口 L==R
前一个数组值 一直与后面的最大值比较
数组求和
//递归求数组和
//第一个数组值 +后面数组值的和
//递归出口下标为最后一个
#include <stdio.h>
//求从arr[a]到arr[n]的和
int f(int arr[],int a,int n)
{
if(a==n)//递归出口
{
return arr[a];
}
else
{
return arr[a]+f(arr,a+1,n);
}
}
int f(int arr[],int a,int n);
int main()
{
int arr[5]={1,5,3,6,7};
int sum=f(arr,0,4);
printf("%d",sum);
}
递归冒泡
第一次找到最大值后 要给前R-1个冒泡
//前一个数字比后一个数字大 就交换位置
//一次冒泡 就有了最大值
#include <stdio.h>
void f(int arr[],int L,int R)
{
//递归出口
if(L<R)
{
for(int i=0;i<R;i++)
{
if(arr[i]>arr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
f(arr,L,R-1);
}
}
int main()
{
int arr[5]={1,4,6,3,7};
f(arr,0,4);
for(int i=0;i<5;i++)
{
printf("%d\n",arr[i]);
}
}
所以求最大公约数变成了求 b,r的最大公约数
一直到r为0 则b就是 72 56的最大公约数
//a=72 b=56
//72/56=1...16
//56/16=3...8
//16/8=2
//所以结果是8
#include <stdio.h>
int gcd(int a,int b)
{
int r=a%b;
if(r==0)
{
return b;
}
else{
return gcd(b,r);
}
}
int main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
int g=gcd(a,b);
printf("%d\n",g);
return 0;
}