递归(记忆方法)

递归

在这里插入图片描述

在这里插入图片描述
如图 每一项都是前面一项+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;
}
原创文章 159 获赞 4 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44769592/article/details/101213306