从编译原理理解递归
来源:互联网 发布:淘宝客佣金计算规范 编辑:程序博客网 时间:2024/09/21 08:16
递归
相关概念
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=1position <-1
A(int n) n=2 position <-1
A(int n) n=2position <-1
n=2position <-1
n=2position <-1
n=2position <-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=3position <-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)
斐波那契数列排列后类似如下形式
引用
- https://en.wikipedia.org/wiki/Fibonacci_number
- https://www.youtube.com/watch?v=dxyYP3BSdcQ
- https://www.youtube.com/watch?v=ygK0YON10sQ
阅读全文
0 0
- 从编译原理理解递归
- 从编译原理理解数组名
- 从编译原理的角度理解面向对象----0
- 编译原理 消除左递归
- 编译原理-左递归文法
- 编译原理 消除左递归
- 编译原理练习 递归下降
- 编译原理-递归子程序法
- 编译原理-递归下降分析器
- 从原理上理解jsonp
- 编译原理之整体理解
- 编译原理--文法的理解
- 编译原理(递归下降分析程序)
- 编译原理文法语言递归实现
- 递归下降分析法(编译原理)
- 编译原理—递归下降分析
- 消除文法左递归-编译原理
- 编译原理(三) 消除文法左递归
- KMP小结
- 素数环
- 10.4、spring boot的web应用——支持freemarker模板视图
- 深入理解Java对象的创建过程:类的初始化与实例化
- 5-2 派生类的构造函数
- 从编译原理理解递归
- Android.mk详解
- php内置函数,字符串处理函数
- 网络连接评分机制之NetworkMonitor
- git使用经验
- 一个小白程序员的目标
- 使用py-faster-rcnn训练自己的数据集
- 九章算法 | Facebook 面试题 : Backpack VI 背包算法
- Java面试题汇总