《算法很美》2.1 2.2 递归Day5

递归:重复中的变化,变化中的重复

public static void main(String[] args) {
		f(10);
		System.out.println("求n阶乘:"+f1(10));
		
		f2(1,10);
		
		System.out.println("数组求和:"+f3(new int[] {1,2,3,4,5},0));
		
		System.out.println("翻转字符串"+f4("abcd",3));
	}
	//注意死循环
	public static void f(int i) {
		if(i==0) {
			System.out.println("000");
			return;
		}
		f(i-1);
	}
	/*
	 * 求n阶乘
	 * 1.找重复:n*(n-1)的阶乘,求n-1的阶乘是原问题的重复(规模更小)---子问题
	 * 			ps.子问题是原问题的重复但规模更小
	 * 2.找变化:变化的量为参数(乘的长度一直变)
	 * 3.找边界:出口(临界的时候)
	 * */
	public static int f1(int n) {
		if(n==1) {
			return 1;
		}
		return n*f1(n-1);
	}
	
	/*
	 * 打印i到j
	 * 1.找重复:(划一刀变更小问题)
	 * 2.找变化:变化的量为参数(数值一直在变)
	 * 3.找边界:出口(临界的时候)
	 * */
	public static void f2(int i,int j) {
		if(i>j) {
			return;
		}
		System.out.println(i);
		f2(i+1,j);
	}
	
	/*
	 * 数组求和
	 * 1.找重复:数组每个数字
	 * 2.找变化:变化的量为参数(长度一直在变)
	 * 3.找边界:出口(临界的时候)
	 * */
	public static int f3(int[] arr,int start) {
		if(start==arr.length-1) {
			return arr[start];
		}
		return arr[start]+f3(arr,start+1);
	}
	
	/*
	 * 翻转字符串
	 * 1.找重复:每个字符
	 * 2.找变化:变化的量为参数(长度一直在变,尾部作为划分)
	 * 3.找边界:出口(临界的时候)
	 * */
	public static String f4(String str,int end) {
		if(end==0){
			return ""+str.charAt(0);
		}
		//最后一个字符放在最前面
		return str.charAt(end)+f4(str,end-1);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值