从编译原理理解递归

来源:互联网 发布:淘宝客佣金计算规范 编辑:程序博客网 时间: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

原创粉丝点击