蓝桥杯Java算法基础递归的使用

各种基本递归汇总

package 基础;

import java.util.Arrays;

/*
 * 重复中找变化。在变换中找规律
 * 1.找重复(原问题的重复,规模更小,即子问题)
 * 找到一种划分的方法
 * 找到递推公式或者等价代换(都是父问题转换为子问题)
 * 2.找变化
 * 变化的量常作为参数
 * 3.找边界(找出口)
 */
public class 递归 {
	public static  void main(String[] args) {
		System.out.println(f1(3));
		f2(4,7);
		int arr[]=new int[] {1,3,4,5,6,8,7,2};
		System.out.println(f3(arr,2));
		System.out.println(f4("abcdefghijk",10));
		System.out.println(f5(10));
		System.out.println(f6(4,0));
		f7(arr,7);
		System.out.println(Arrays.toString(arr));
		System.out.println(f8(new int[]{1,2,3,4,5,6,7,8},0,7,5));
		int arr1[]=new int[]{2,4,5,1,6,3,7,8};
		f9(arr1);
		System.out.println(Arrays.toString(arr1));
		
	}
	
	//求数的阶乘
	public static int f1(int num) {
		
		if(num==1) {
			return 1;
		}
		return num*f1(num-1);
	}
	//打印i到j
	public static void f2(int i,int j) {
		if(i>j) {
			return ;
		}
		System.out.println(i);
		f2(i+1,j);
	}
	//数组求和使用递归
	public static int f3(int arr[],int begin) {
		if(begin==arr.length-1) {
			return arr[begin];
		}
		return arr[begin]+f3(arr,begin+1);
	}
	//翻转字符串使用递归
	public static String f4(String str,int end) {
		if(end==0) {
			return ""+str.charAt(0);
		}
		return str.charAt(end)+f4(str,end-1);
	}
	//斐波那契数列 1 1 2 3 5 8 13 
	public static int f5(int n) {
		if(n==1|n==2) {
			return 1;
		}
		return f5(n-1)+f5(n-2);
	}
	
	//求最大公约数使用递归
	public static int f6(int m,int n) {
		if(n==0) {
			return m;
		}
		return f6(n,m%n);
	}
	
	//递归形式进行插入排序
	public static void f7(int arr[],int k) {
		if(k==0) {
			return ;
		}
		//分解成小数组,在小数组中进行插入排序
		f7(arr,k-1);
		int a=arr[k];
		int index=k-1;
		while(a<arr[index]&&index>-1) {
			arr[index+1]=arr[index];
			index--;
		}
		arr[index+1]=a;
	}
	//二分查找递归解法
	 public static int f8(int arr[],int low,int high,int key) {
		 if(low>high) {
			 return -1;
		 }
		 int mid=low+((high-low)>>1);
		 int num=arr[mid];
		 if(num<key) {
			 return f8(arr,mid+1,high,key);
		 }
		 else if(num>key) {
			 return f8(arr,low,high-1,key);
		 }
		 else {
			 return mid;
		 }
	 }
	 //希尔排序使用递归
	 public static void f9(int arr[]) {
		 //不断缩小增量
		 for(int len=arr.length/2;len>0;len=len/2) {
			 for(int i=len;i<arr.length;i++) {
				 int target=arr[i];
				 int j=i-len;
				 while(j>-1&&target<arr[j]) {
					 arr[j+len]=arr[j];
					 j=j-len;
				 }
				 arr[j+len]=target;
			 }
		 }
	 }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值