递归转非递归(实例)

递归调用示例
算法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








原文地址:https://www.cnblogs.com/xiaowei-blog/p/3796043.html