zoukankan      html  css  js  c++  java
  • 递归转非递归(实例)

    递归调用示例
    算法1.10  求取数组元素的最大值(递归算法)
        procedure MAX1(i)
        // 查找数组A中最大值元素,并返回该元素的最大下标。//
            global integer n,A(1:n),j,k
            integer i
            if i<n then j←MAX1(i+1)  //递归调用//
                   if A(i) > A(j) then k←i
                       else k←j
                   endif
               else k←n
           endif
           return(k)                 //递归调用的返回//
       end MAX1    
    消去上例中的递归
      procedure MAX2(i)
            local integer j,k; global integer n, A(1:n)
            integer i
            integer STACK(1:2*n)
            top←0     //规则1,声明栈的代码,并初始化为空//
       L1: if i<n      //规则2,将标号L1赋于第一条可执行语句前//
            then top ←top + 1; STACK(top)←i;   // 规则3,参数或局部变量的值入栈//
                    top ←top +1; STACK(top)←2;  // 规则4,建立新标号2,并入栈//         
                    i ←i+1             // 规则5, 计算参数值//
                    goto L1             //规则6, 无条件转向算法的开始部分//
       L2: j ←STACK(top); top ←top-1;  // 规则7, 处理函数调用, 并将标号2赋于该语句上//
              if A(i) > A(j) then k ←I
                     else k ←j
             endif
         else  k ←n
         endif
       if top = 0 then return(k)  // 规则8, 如果栈空,则正常返回//
             else addr ←STACK(top);top ←top-1;  // 规则10, 从 栈中退出返回标号//
                     i ←STACK(top);top ←top-1;  // 规则11, 从栈中退出局部变量和参数的值//
                     top ←top+1;STACK(top) ←k;  // 规则12, 计算返回值,并将之入栈//
                     if addr = 2 then goto L2 endif  // 规则13, 用返回地址标号的下标实现对该标号的转向//
        endif
    end MAX2








  • 相关阅读:
    规格说明书-----吉林1日游
    每周代码及工作总结(第九周)
    评论beta发布
    每周代码及工作总结(第八周)
    半年之后没啥意思,开个博客
    本周例行报告
    final发布评论Ⅱ
    课堂final发布
    本周例行报告
    回顾
  • 原文地址:https://www.cnblogs.com/xiaowei-blog/p/3796043.html
Copyright © 2011-2022 走看看