如何写递归以及用递归实现斐波那契数列 数组求和 求最大公约数 字符串翻转 打印i到j的每一个数 java实现

详细步骤都再注释里了~

public class HowToCreateRecursion {

	/*
	 * 创建递归的步骤
	 * 1 找重复:更小规模的子问题
	 * 2 找变化:变化的量作为参数
	 * 3 找边界:出口,一般写在递归函数中的第一行
	 * */
	
	/**
	 * 用递归打印i到j之间的数
	 * @param i
	 * @param j
	 */
	public  static void iToJ(int i,int j)
	{
		if(i>j)
			return;
		System.out.println(i);
		iToJ(i+1,j);
	}
	
	/**
	 * 对数组求和
	 * @param a
	 * @return
	 */
	public static int sumArr(int a[],int begin)
	{
		//必须增加一个参数,运行一次,就指向数组的下一个元素
		if(begin==a.length-1)
			return a[a.length-1];
		return a[begin]+sumArr(a,begin+1);
	}
	
	/**
	 * 递归完字符串翻转
	 * @param str
	 * @param end
	 * @return
	 */
	public static String reverse(String str,int end) {
		//eg:abcd,相当于d拼接abc的翻转结果
		if(end==0)
			return ""+str.charAt(0);
		return str.charAt(end)+reverse(str,end-1);
		
	}
	
	
	/**
	 * 求斐波那契数列的某一项
	 * @param n
	 * @return
	 */
	public static int fib(int n)
	{
		//问题规模变大:前面几个问题都是单支,递归是树形
		//求的数字越大,树越深,耗时越长
		//可优化:因为有重复求解的现象
		//因为求解f(n-1)的过程,包括了求解f(n-2)的过程
		if(n==1||n==2)
			return 1;
		return fib(n-1)+fib(n-2);
	}
	
	/**
	 * 巧用递推公式求最大公约数
	 * @param m
	 * @param n
	 * @return
	 */
	public static int zuiDaGongYueShu(int m,int n)
	{
		if(n==0)
			return m;
		return zuiDaGongYueShu(n,m%n);
	}
	

	
	public static void main(String[] args) {
		iToJ(8,18);
		System.out.println(sumArr(new int []{1,2,3,4,5},0));
		System.out.println(reverse(new String("abcdef"),5));
		System.out.println(fib(5));
		System.out.println(zuiDaGongYueShu(16,12));
	
	}
}

发布了24 篇原创文章 · 获赞 10 · 访问量 1290

猜你喜欢

转载自blog.csdn.net/qq_41625102/article/details/104419347
今日推荐