一、递归三要素
(1)明确递归终止条件;---不再往下进行了
(2)给出递归终止时的处理办法;
(3)提取重复的逻辑,缩小问题规模
举例1:斐波那契数列(兔子问题)
问题描述:
已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后,第三个月开始生小兔子,假如一年内没有发生死亡,则一对兔子开始,第N个月后会有多少对?
代码:
// 方法1:程序员写法 public static int fibonacci(int n) { // 也可以写成if(n==0||n==1的形式)---高大上 switch (n) { // 出口条件一 case 0: return 0; // 出口条件二 case 1: return 1; // 在方法中调用自己 default: return fibonacci(n - 1) + fibonacci(n - 2);//当前月等于前一个月的数量加上前两个月的数量 } } // 方法2:我的写法 public static Long fibonacci1(int i) { if (i == 1 || i == 2) return 1L;// 漂亮(一层一层循环--解决了数据溢出的问题) else return fibonacci1(i - 1) + fibonacci1(i - 2); }
三要素说明:上面的fibonacci()就是一个递归的方法; 首先,他在方法内部调用了自己(return fibonacci(i-1)+fibonacci(i-2)); 然后,有明确的递归终止条件(当i为1,或者为2的时候); 其次,有给出递归终止时的处理办法(return 1); 最后,提取重复的逻辑,缩小问题规模;
补充:假如不使用递归,可以使用循环实现,理论上所有递归都可以用循环实现,但是复杂了很多
举例2:n阶阶乘问题
// 方法1:计算阶乘的方法,典型的递归方法 public static long factorial(long n) { if (n >= 1) { // 递归方法特点一:在方法中调用自己 return n * factorial(n - 1); } else { // 递归方法特点二:有至少一个出口条件 return 1; } }
举例3:自然数[1,max]的求和
public int sumByMax(int max){ if(max>=2){ return max+sumByMax(max-1); }else{ return max; } }
递归简单理解:找到了给予其返回值,层层回溯--理解为多层函数嵌套
其它问题:青蛙跳台阶,迷宫问题,或者最经典的汉诺塔问题,八皇后问题
台阶描述:已知一个楼梯有n个台阶,每次可以选择迈上一个或者两个台阶,求走完一共有多少种不同的走法?
未完待续。。。