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








  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/xiaowei-blog/p/3796043.html
Copyright © 2011-2022 走看看