`

递归算法(4)

阅读更多
  1. /**  
  2.  *  
  3.  * @author SunnyMoon  
  4.  */  
  5. //////////////////////////////////////////////////////////////////////////////   
  6. /**  
  7.  * 概念介绍:  
  8.  *   
  9.  * 消除递归:  
  10.  * 一个算法作为一个递归的方法通常从概念上很容易理解,但实际使用中递归的效率不高,在这种  
  11.  * 情况下,把递归算法转换成非递归的算法是非常有用的,这种转换经常用到栈。  
  12.  *   
  13.  * 递归和栈:  
  14.  * 递归和栈之间有着紧密的联系,大部分的编译器使用栈实现递归的。  
  15.  *   
  16.  * 调用方法的时候发生什么:  
  17.  * 1. 编译器会把这个方法所有当前参数及返回地址压入栈中;  
  18.  * 2. 将控制权交给这个方法,方法通过获得栈顶元素值访问参数;  
  19.  * 3. 方法运行结束的时候,值退栈,参数消失且控制权重新回到返回地址;  
  20.  *   
  21.  * 模拟递归方法:  
  22.  * 可以将任意一个递归方法转换为非递归的基于栈的方法。在一些简单的情况可以完全消除栈,只  
  23.  * 使用一个简单的循环,但是在很复杂的情况,算法中必须须要保留栈。本例子是简单的情况,可  
  24.  * 以进一步完全消除栈。  
  25.  */  
  26. /////////////////////////////////////////////////////////////////////////////   
  27.  /**  
  28.   * 计算三角数字的问题:  
  29.   * 递归算法描述如下  
  30.   * int triiangle(int n){  
  31.   *      if(n==1)  
  32.   *          return 1;  
  33.   *      else  
  34.   *          return (n+triangle(n-1));  
  35.   * }  
  36.   */  
  37. import java.io.*;   
  38. /**  
  39.  * 模拟一个递归方法,通用的方式消除递归  
  40.  */  
  41. class Params {//封装了方法的返回地址和方法的参数   
  42.   
  43.     public int number;   
  44.     public int returnAddress;   
  45.   
  46.     public Params(int num, int returnAdd) {   
  47.         number = num;   
  48.         returnAddress = returnAdd;   
  49.     }   
  50. }   
  51.   
  52. class StackX {//模拟递归时使用的栈   
  53.   
  54.     private int maxSize;   
  55.     private Params[] stackArray;   
  56.     private int top;   
  57.   
  58.     public StackX(int s) {   
  59.         maxSize = s;   
  60.         stackArray = new Params[maxSize];   
  61.         top = -1;   
  62.     }   
  63.   
  64.     public void push(Params p) {   
  65.         stackArray[++top] = p;   
  66.     }   
  67.   
  68.     public Params pop() {   
  69.         return stackArray[top--];   
  70.     }   
  71.   
  72.     public Params peek() {   
  73.         return stackArray[top];   
  74.     }   
  75. }   
  76.   
  77. class StackTriangleApp {   
  78.   
  79.     static int theNumber;   
  80.     static int theAnswer;   
  81.     static StackX theStack;   
  82.     static int logicAddress;   
  83.     static Params theseParams;   
  84.   
  85.     public static void main(String[] args) throws IOException{//主方法   
  86.         System.out.print("Number = ");   
  87.         theNumber = getInt();   
  88.         stackTriangle();   
  89.         System.out.println("");   
  90.         System.out.println("Trriangle = " + theAnswer);   
  91.     }   
  92.   
  93.     @SuppressWarnings("empty-statement")   
  94.     public static void stackTriangle() {//计算三角数字的方法,模拟递归方法   
  95.         theStack = new StackX(100);   
  96.         logicAddress = 1;//设置一个逻辑地址为入口地址   
  97.         while (step() == false);   
  98.     }   
  99.   
  100.     public static boolean step() {   
  101.         switch (logicAddress) {   
  102.             case 1:   
  103.                 theseParams = new Params(theNumber, 6);//设定循环返回的地址   
  104.                 theStack.push(theseParams);   
  105.                 logicAddress = 2;   
  106.                 break;   
  107.             case 2:   
  108.                 theseParams = theStack.peek();   
  109.                 if (theseParams.number == 1) {   
  110.                     theAnswer = 1;   
  111.                     logicAddress = 5;   
  112.                 } else {   
  113.                     logicAddress = 3;   
  114.                 }   
  115.                 break;   
  116.             case 3:   
  117.                 Params newParams = new Params(theseParams.number - 14);   
  118.                 theStack.push(newParams);   
  119.                 logicAddress = 2;   
  120.                 break;   
  121.             case 4:   
  122.                 theseParams = theStack.peek();   
  123.                 theAnswer = theAnswer + theseParams.number;   
  124.                 logicAddress = 5;   
  125.                 break;   
  126.             case 5:   
  127.                 theseParams = theStack.peek();   
  128.                 logicAddress = theseParams.returnAddress;   
  129.                 theStack.pop();   
  130.                 break;   
  131.             case 6:   
  132.                 return true;   
  133.         }   
  134.         return false;   
  135.     }   
  136.   
  137.     public static String getString() throws IOException{   
  138.         InputStreamReader isr = new InputStreamReader(System.in);   
  139.         BufferedReader br = new BufferedReader(isr);   
  140.         String s = br.readLine();   
  141.         return s;   
  142.     }   
  143.     public static int getInt() throws IOException{   
  144.         String s=getString();   
  145.         return Integer.parseInt(s);   
  146.     }   
  147. }   
  148. /**  
  149.  * 总结:  
  150.  * 当要求效率的时候可以把弟归转化为基于栈的非递归,进而可以把基于栈的转化为仅有循环的  
  151.  * 非递归,这种情况下效率是最高的。  
  152.  * 但是一些复杂的情况可以转化为基于栈的非递归,但是无法消除栈的。  
  153.  * 一些递归的算法是非常优秀的,比如分治算法。  
  154.  */  
分享到:
评论

相关推荐

    5!递归算法和非递归算法

    递归算法和非递归算法 在计算机科学与编程领域中,递归算法与非递归算法是两种非常重要的计算方法。本文将详细介绍这两种算法的特点、应用场景以及如何实现它们,特别针对初学者及面试准备者。 #### 递归算法 ...

    VC对磁盘文件遍历搜索的递归算法和非递归算法

    在VC++(Visual C++)环境中,有多种方法可以实现这一目标,其中最常见的是递归算法和非递归算法。这两种方法各有优缺点,适用于不同的场景。 **递归算法**: 递归算法是一种基于函数自身调用解决问题的方法。在...

    .net 递归算法 .net 递归算法.net 递归算法

    在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...

    acm递归算法总结竞赛

    在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...

    abap简单递归算法

    ### ABAP简单递归算法解析 #### 一、引言 ABAP(Advanced Business Application Programming)是一种用于SAP系统的编程语言。它不仅支持传统的过程化编程,还支持面向对象编程和Web开发。本文将深入探讨一个ABAP中...

    汉诺塔问题的非递归算法

    对于解决汉诺塔问题,传统方法是通过递归算法实现,即通过不断将问题规模缩小,直到简化到最基本的情况,然后逐步返回并解决每一层的子问题。然而,递归算法在处理大量圆盘时容易引起调用栈过深,导致效率低下。因此...

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现

    快速排序算法设计与分析总结 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现 二叉树与树的转换前序、后序的递归、非递归算法,层次序的非递归算法的实现,应包含建树的实现 实现树与...

    18.递归算法与递归算法应用.ppt

    18.递归算法与递归算法应用.ppt

    递归算法与循环算法的分析

    递归算法与循环算法的分析 递归算法是指在程序设计中,在调用一个函数的过程中又出现直接或间接调用其函数本身的现象。递归算法的优点是编写容易,结构清晰,可读性强,但是其缺点是计算速度慢,时间花费较长,效率...

    合并排序递归和非递归算法

    3. **可读性和实现难度**:递归算法通常代码简洁,易于理解,而非递归算法可能需要更复杂的逻辑来模拟递归行为。 总的来说,选择哪种实现方式取决于具体场景,如内存限制、性能要求以及代码的可读性等。递归版本的...

    递归算法ppt让你快速上手

    "递归算法ppt让你快速上手" 递归算法是计算机科学中的一种重要算法思想,它可以解决许多复杂的问题。下面是递归算法的知识点总结: 1. 递归的定义:若一个对象部分地包含它自己,或用它自己给自己定义,则称这个...

    递归算法专题ppt

    ### 递归算法专题知识点详解 #### 一、递归算法原理 递归算法是一种将问题分解成子问题的方法,其中子问题与原问题性质相同但规模较小。递归算法的关键在于识别出能够通过递归解决的问题,并找到递归的基本情况...

    程序设计中递归算法

    ### 递归算法在程序设计中的应用 #### 一、递归的概念与本质 递归是一种重要的编程思想,在计算机科学和数学领域都有广泛的应用。它指的是一个过程或函数直接或间接地调用自身来解决问题的方法。递归的核心在于将...

    递归算法转为非递归算法

    递归算法转为非递归算法。方法、过程,用栈的原理

    递归算法的详解,各种常见递归算法

    递归算法是一种强大的编程技术,它通过函数或过程在解决问题时调用自身来解决更小规模的相同问题。递归的基本概念在于一个函数在定义中包含对自身的引用,或者问题的解决方案依赖于较小规模问题的解决方案。在程序...

    Hanoi塔问题的一种非递归算法

    ### Hanoi塔问题的一种非递归算法:深入解析与实现 #### 一、引言 Hanoi塔问题作为计算机科学领域内经典的递归问题之一,因其简洁性和挑战性而广受关注。通常,Hanoi塔问题的解决方案多采用递归算法,尽管其逻辑...

    利用递归算法求阶乘(VB6.0源代码)利用递归算法求阶乘

    在这个主题中,我们将深入探讨如何使用递归算法在VB6.0(Visual Basic 6.0)中计算阶乘。VB6.0是Microsoft开发的一款经典可视化编程环境,用于创建Windows应用程序。 阶乘是一个数学概念,表示一个正整数n的所有...

    中序遍历二叉树非递归算法

    在IT领域,尤其是在数据结构与算法的学习中,中序遍历二叉树的非递归算法是一个关键且实用的知识点。通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法...

    使用C++,请给出此题的递归算法及非递归算法。

    在编程领域,递归算法和非递归算法是两种常见的解决问题的方法。递归算法是通过函数或过程调用自身来解决复杂问题的方式,而非递归算法则是通过循环或其他逻辑结构来实现相同的目标。这里我们将详细探讨这两种算法在...

Global site tag (gtag.js) - Google Analytics