第 16 天: 递归
递归的思想
以此类推是递归的基本思想。
具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
递归的两个条件
- 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)
- 存在一种简单情境,可以使递归在简单情境下退出。(递归出口)
递归三要素:
- 一定有一种可以退出程序的情况;
- 总是在尝试将一个问题化简到更小的规模;
- 父问题与子问题不能有重叠的部分;
package day10; public class Recursion { /** ********************* * Sum to N. No loop, however a stack is used. * * @param paraN * The given value. * @return The sum. ********************* */ public static int sumToN(int paraN) { if (paraN <= 0) { //Basis. return 0; } // Of if return sumToN(paraN - 1) + paraN; }// Of sumToN /** ********************* * Fibonacci sequence. * * @param paraN * The given value. * @return The sum. ********************* */ public static int fibonacci(int paraN) { if (paraN <= 0) { //Negative values are invalid. Index 0 corresponds to the first element 0. return 0; } if (paraN == 1) { //Basis. return 1; }//Of if return fibonacci(paraN - 1) + fibonacci(paraN - 2); }//Of fibonacci /** ********************* * The entrance of the program. * * @param args * Not used now. ********************* */ public static void main(String args[]) { int tempValue = 5; System.out.println("0 sum to " + tempValue + " = " + sumToN(tempValue)); tempValue = -1; System.out.println("0 sum to " + tempValue + " = " + sumToN(tempValue)); for(int i = 0; i < 10; i ++) { System.out.println("Fibonacci " + i + ": " + fibonacci(i)); }//Of for i }// Of main }
今天的递归代码看着简单,但是用起来就没那么简单,之前在二叉树的学习中经常用到递归的思想,搞得我很晕。。但是现在基础部分举例计算就能很好理解,就当重新学习了,一步一步学明白,因为使用递归这个方法在简化问题方面很有作用,递归中的“递”就是入栈,递进;“归”就是出栈,回归。另外系统会为递归建栈。