递归法:快速掌握递归核心方法

递归我的理解就是
方法或函数调用自己就称为递归
1.分解为:直接量+小规模问题
2.分级为:小规模问题
在这里插入图片描述
要想计算f(10),就需要知道f(9),算f(9)需要计算f(8)
特点:
1.自身调用自身
2.避免死循环
方法:
1.找重复(找更小规模的子问题(和原问题具有相同的形式);求n的阶乘,先求n-1的阶乘。。。。)
2.找变化(哪些东西在变化,求n的阶乘,先求n-1的阶乘,。。。。将变化的量作为参数)
3.找边界(循环终止的条件,出口的判断,求n的阶乘,一直递归变为求1的阶乘,到1的时候,1的阶乘为1,返回)
一、求n的阶乘
求n的阶乘,先求n-1的阶乘

#include<iostream>  
using namespace std;   

int f(int){
	int n;
	if(n==1)   //当n=1的时候,条件终止
	return 1;
	else 
	return n*f(n-1)   //求n-1的阶乘,再次缩小变为n-1*n-2,n就会越来越小
}   

二、打印i-j

#include<iostream>
using namespace std;

static void f(int i,int j){    //i为变量,j作为终点不变
if(i>j)  //为出口;终止
return;
cout<<i<<endl;  //打印i
f(i+1,j);   //i+1越靠近j,离j越来越近
}  
int main(){
	f(1,10);  
}

三、求数组的和
1.找重复,将arr化为小的规模,将第一个划分出来,剩下的交给递归一直这样重复
2.找变化,数组的长度在变化,起点的不断变化,数组的区间在缩小,终点不变
3.找边界,就为数组的长度

#include<iostream>
using namespace std;

static int f(int arr[],int begin ){  //begin初始数组
	if (begin==arr.length-1){
		return arr[begin];
	}
	return arr[begin]+f(arr,begin+1);   //
}
int main(){
	int res=f(new int[]{1,2,3,4,5},begin 0);
	cout<<res<<endl; 
} 

四、反转字符串
abcd 反转后变为dcba
在这里插入图片描述
依次类推最后为b拼接a
变量:为终点在变化,变到起点的时候终止

#include<iostream>
#include<cstring> 
#include<algorithm>
#include<vector>
using namespace std;

static String res(String src,int end){
	if(end==0)
	{
		return ""+src.charAt(0);
	}
	return src.charAt(end)+res(src,end-1);
}
int main(){
	cout<<res<<endl;
	cout<<(res("abcd",3))<<endl;;
}
发布了71 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/104378881