递归
相关概念
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)
斐波那契数列排列后类似如下形式
引用