zoukankan      html  css  js  c++  java
  • 经典算法-总结之递归算法

    如题:

    递归函数往往可以简化我们的代码,尤其是对树的遍历和利用回溯算法写代码的时候,但是递归函数的返回值往往是困扰我们的。

    总体来说,我们先要理解函数的调用过程,函数调用过程会用栈来保存函数的返回值和过程,而递归函数就是调用自身函数的过程,所以也是用栈存储,这样就比较容易理解了。

    下面一段代码可以帮助大家理解递归函数的返回值。

    package test;
    
    
    public class RecursionValueReturn {
    
        /*
         *目的: 
         * 递归返回值测试
         */
        
        int recurse(int i)
        {
            if(i == 0)
            {
                return 0;
            }
            else
            {
                i--;//i--必须放在前面,由于函数的中间结果值用栈保存,不然i--无法执行,会使递归函数对系统的栈用光
                recurse(i);
                //i--;
            }
            
            System.out.print(" "+ i);
            return i;
            
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            RecursionValueReturn result = new RecursionValueReturn();
            int value =  result.recurse(10);
            System.out.println();
            System.out.println("final return value " + value);
        }
    
    }

    下面是程序的输出结果截图.

     

    由输出和函数的返回结果可以看出,递归函数是用栈存储函数返回值和中间过程,每次返回栈顶的结果(包括中间的输出值和返回值),而递归函数最终的返回值的是栈底的值,也就是递归函数第一次调用时的返回值.

    下面是压入栈过程的示意图。

     优劣:

    由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/wwwhza/p/7689257.html
Copyright © 2011-2022 走看看