算法很美 递归基础

大家关注微信公众号 罡罡同学 回复蓝桥杯

可免费获得历年真题和C语言版的真题源代码

递归基础

1.递归求阶乘
2.递归打印连续数字
3.递归求数组元素之和
4.字符串翻转
5.斐波那契数列
6.最大公约数
7.递归进行插入排序

public class Main {
     
	public static void main(String[] args) {
     
		//int res=f3(new int[]{1,2,3,4,5},0);
		//System.out.println(res);
		 //System.out.println(reverse("abcd", 3));
		
		//System.out.println(fib(5));
		int[] arr={
     4,3,2,5,0};
		insertSort(arr,4);
		for(int i=0;i<arr.length;i++){
     
			System.out.print(arr[i]+" ");
		}
		 
    }
	/*
	 * f1(n):求n的阶乘-->f1(n-1)求n-1的阶乘
	 * 找重复:n*(n-1)的阶乘,求n-1的阶乘是原问题的重复(规模更小)——子问题
	 * 找变化:变化的量应该作为参数
	 * 找边界:出口
	 * */
	static int f1(int n){
     //递归求阶乘  f(n)=n*f(n-1)
		if(n==1)
			return 1;
		return n*f1(n-1);
	}
	
	/*
	 * 找重复: 
	 * 找变化:变化的量应该作为参数
	 * 找边界:出口
	 * */
	static void f2(int i,int j){
     //递归打印连续数字 p(i,j)=p(i)->p(i+1,j)
		if (i>j) {
     
			return;
		}
		System.out.println(i);
		f2(i+1, j);
	}
	
	/*
	 * 对arr的所有元素求和
	 * 找重复: 
	 * 找变化:变化的量应该作为参数
	 * 找边界:出口
	 * */
	static int f3(int[] arr,int begin){
     //递归求数组元素之和
		if(begin==arr.length-1){
     
			return arr[begin];
		}
		return arr[begin]+f3(arr, begin+1);
	}
	
	/*
	 * 字符串翻转
	 * */
	static String reverse(String src,int end){
     
		if(end==0){
     
			return ""+src.charAt(0);
		}
		return src.charAt(end)+reverse(src, end-1);
	}
	//上面的例子都是1.切蛋糕思维
	/*对于一个问题,可以划分为:
	 * 分解为:直接量+小规模子问题
	 * 分解为:多个小规模子问题
	 * */
	static int fib(int n){
     //斐波那契数列f(n)=f(n-1)+f(n-2)
		if(n==1||n==2)
			return 1;
		return fib(n-1)+fib(n-2); 
	}
	/*
	 * 最大公约数 f(m,n)=f(n,m%n)   
	 * m%n=0  返回n
	 * 辗转相除法
	 * */
	static int gcd(int m,int n){
     
		if(n==0) return m;
		return gcd(n, m%n);
	}
	
	
	/*对数组0—倒数第一个 排序
	 * 等价于:对数组的0~倒数第二个元素,这部分排序
	 * 然后把最后一个元素插入到这个有序的部分中
	 * */
	static void insertSort(int[] arr,int k){
     
		if(k==0){
     
			return;
		}
		//对前k-1个元素排序
		insertSort(arr, k-1);
		//把位置k的元素插入到前面的部分
		int x=arr[k];
		int index=k-1;
		while(index>-1&&x<arr[index]){
     
			arr[index+1]=arr[index];
			index--;
		}
		arr[index+1]=x;
	}
	
	
	
	
}

递归基础小结:(循环一定可以改成递归,只不过有的简单,有的复杂)

找重复
1.找到一种划分方法
2.找到递推公式或者等价转换
都是父问题转化为子问题

找变化的量
变化的量通常要作为常数

找出出口

谢谢大家的支持,您的一键三连是 罡罡同学前进的最大动力!

一键三连 一键三连 一键三连 一键三连 一键三连 一键三连

你可能感兴趣的:(JAVA,java,递归,算法很美)