从编译原理理解递归


递归
相关概念
1 栈结构
2 终止条件
3 编译原理
从最简单的例子入手
demo1

public class Fibonacci {
   public void A(int n) {
      if(n>0)
        {
        print("%d",n);
        A(n-1);
        }
   }

   public static void main(String[] args) {
       int x=3;
        A(x);
   }
}


输出结果是3 2 1
demo2
public class Fibonacci {
   public void A(int n) {
      if(n>0)
        {
            A(n-1);
            print("%d",n);
        }
   }

   public static void main(String[] args) {
       int x=3;
        A(x);
   }
}
输出结果是1 2 3 
重点在于理解编译器的栈运行模式
参考编译原理
demo1
heap











stack























  n=0






A(int n)  n=1 position  <-1
n=1position  <-1
n=1 position  <-1




  A(int n)  n=2 position  <-1
A(int n)  n=2position  <-1
n=2position  <-1
n=2position  <-1
n=2 position  <-1


  A(int n)  n=3   postion  <-1
A(int n)  n=3    position  <-1
A(int n)  n=3 position  <-1
n=3 position  <-1
n=3position  <-1
n=3position  <-1
n=3 position  <-1
console

3
 2
1




static variables








code
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);
        A(n-1);
          }
   }

   public static void main(String[] args) <- 1 {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);   
        A(n-1); <-1
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);
        A(n-1); <-1
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);
        A(n-1); <-1
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0) <-1
          {
        print("%d",n);
        A(n-1);
          }
   }<-2

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);
        A(n-1); <-1
          }<-2
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);
        A(n-1); <-1
          } <-2
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        print("%d",n);
        A(n-1); <-1
          }<-2
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
demo2
heap












stack

























  A(int n)  n=0position  <-1 要执行 };
n=0position  <-1






A(int n) n=1position  <-1 要执行 print("%d",n);
A(int n)  n=1position  <-1 要执行 print("%d",n);
A(int n)  n=1position  <-1 要执行 print("%d",n);
A(int n)    n=1position  <-1




A(int n)  n=2position  <-1 要执行 print("%d",n);
A(int n)  n=2position  <-1 要执行 print("%d",n);
A(int n)  n=2position  <-1 要执行 print("%d",n);
A(int n)  n=2position  <-1 要执行 print("%d",n);
A(int n)  n=2position  <-1 要执行 print("%d",n);
A(int n)    n=2position  <-1 要执行 print("%d",n);
A(int n)  n=2position  <-1 要执行 print("%d",n);

A(int n)  n=3   position  <-1 要执行print("%d",n);
A(int n)  n=3    position  <-1 要执行 print("%d",n);
A(int n)  n=3 position  <-1 要执行 print("%d",n);
A(int n)  n=3 position  <-1 要执行 print("%d",n);
A(int n)  n=3 position  <-1 要执行 print("%d",n);
A(int n)  n=3 position  <-1 要执行 print("%d",n);
A(int n)  n=3 position  <-1 要执行 print("%d",n);
A(int n)    n=3 position  <-1 要执行 print("%d",n);
console

 
 
 


1
2
3
static variables









code
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        A(n-1);
        print("%d",n);
          }
   }

   public static void main(String[] args) <- 1 {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) { <-2
      if(n>0)
          {
         A(n-1);<-1 
        print("%d",n);
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) { <-2
      if(n>0)
          {
         A(n-1);<-1
        print("%d",n);
        
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) { <-2
      if(n>0)
          {
         A(n-1);<-1
        print("%d",n);
        
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0) <-1
          {
         A(n-1);
        print("%d",n);
          }
   } <-2

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {    
        A(n-1);
        print("%d",n);
          }
   } <-1

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        A(n-1);
        print("%d",n); <-1
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        A(n-1);
        print("%d",n); <-1
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}
public class Fibonacci {
   public void A(int n) {
      if(n>0)
          {
        A(n-1);
        print("%d",n); <-1
          }
   }

   public static void main(String[] args) {
       int x=3;
         A(x);
   }
}

在举一个例子是 Fibonacci list
f(1)=1    f(0)=0
Demo
public class {
    // 使用递归方法
    private static int getFibo(int i) {
        if (i == 1 || i == 2)
            return 1;
        else
            return getFibo(i - 1) + getFibo(i - 2);
    }

    public static void main(String[] args) {
        System.out.println("斐波那契数列的前20项为:");
        for (int j = 1; j <= 20; j++) {
            System.out.print(getFibo(j) + "\t");
            if (j % 5 == 0)
                System.out.println();
        }
    }
}
费波纳切更能展现出编译原理中编译器的运行结构。

费波纳切运行结构非常恼火
但是通过费波纳切可以记得一个重要点是当进入栈的时候,函数的运行起点同时被保存
保存的要素有三个
函数A() n的值   函数运行位置
当返回后,函数从后面继续执行 
最重要一点
继续往后执行不意味着出栈,而是以前面保存的n值继续执行后面的
return getFibo(i - 1) + getFibo(i - 2);
例如此处  保存getFibo(i - 1) n=i-1 此处i=4 则getFibo(i - 1)执行为getFibo(3)
然后执行 n=i-1 后面的 getFibo(i - 2) 执行getFibo(i - 2) 执行为getFibo(2)


斐波那契数列排列后类似如下形式

引用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值