递归

tips

  • 方法的第一条总是包含一个return的条件语句
  • 递归调用总是尝试去解决一个规模更小的子问题,这样递归才能收敛到最简单的情况
  • 递归调用的父问题和尝试解决的子问题之间不应该由交集

一个有意思的递归,来自《算法》1.1.16 & 1.1.17

//代码

package chapter1;

import java.util.Scanner;

public class practice16 {

	public static int exR1(int n) {
		if (n <= 0)
			return 0;
		return exR1(n - 3) + n + exR1(n - 2) + n;
	}
	
	public static String exR2(int n) {
		if (n <= 0)
			return "";
		return exR2(n - 3) + n + exR2(n - 2) + n;
	}

      /*  这个递归是死递归
          只能递归到发生StackOverflowerError(栈溢出异常)
          因为可以跳出的递归的return语句不是在第一句

        public static String exR3(int n) {
	       return exR2(n - 3) + n + exR2(n - 2) + n;
                if (n <= 0)
			return "";
		
	}
   */

	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			System.out.println("i:"+i+"\texR1:\t"+exR1(i));
			System.out.println("i:"+i+"\texR2:\t"+exR2(i));
		}
		
	}
}
结果:

i:1	exR2:	11
i:2	exR1:	4
i:2	exR2:	22


结果分析:以i=1为例:

        exR2(1 - 3) + 1 + exR2(1 - 2) + 1 
    =>  exR2(-2) + 1 + exR2(0) + 1;
    =>  ""+1+""+1
    =>   11

 

点赞