從編譯原理理解遞迴

2021-08-13 21:38:36 字數 4001 閱讀 2682

遞迴

相關概念

1 棧結構

2 終止條件

3 編譯原理

從最簡單的例子入手

demo1

public class fibonacci }

public static void main(string args) }

輸出結果是3 2 1

demo2

public class fibonacci }

public static void main(string args) }

輸出結果是1 2 3 

重點在於理解編譯器的棧執行模式

參考編譯原理

demo1

heap

stack

n=0

a(int n)  n=1 position 

n=1position 

n=1position 

a(int n)  n=2 position 

a(int n)  n=2position 

n=2position 

n=2position 

n=2position 

a(int n)  n=3   postion 

a(int n)  n=3    position 

a(int n)  n=3 position 

n=3 position 

n=3position 

n=3position 

n=3position 

console

3

2

1

static variables

code

public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

} public static void main(string args)

}public class fibonacci

}public static void main(string args)

} demo2

heap

stack

a(int n)  n=0position 

要執行};

n=0position 

a(int n) n=1position 

要執行print("%d",n);

a(int n)  n=1position 

要執行print("%d",n);

a(int n)  n=1position 

要執行print("%d",n);

a(int n)

n=1position 

a(int n)  n=2position 

要執行print("%d",n);

a(int n)  n=2position 

要執行print("%d",n);

a(int n)  n=2position 

要執行print("%d",n);

a(int n)  n=2position 

要執行print("%d",n);

a(int n)  n=2position 

要執行print("%d",n);

a(int n)

n=2position 

要執行print("%d",n);

a(int n)  n=2position 

要執行print("%d",n);

a(int n)  n=3   position 

a(int n)  n=3    position 

要執行print("%d",n);

a(int n)  n=3 position 

要執行print("%d",n);

a(int n)  n=3 position 

要執行print("%d",n);

a(int n)  n=3 position 

要執行print("%d",n);

a(int n)  n=3 position 

要執行print("%d",n);

a(int n)  n=3 position 

要執行print("%d",n);

a(int n)

n=3 position 

要執行print("%d",n);

console

1

2

3

static variables

code

public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

}public class fibonacci

}public static void main(string args)

} 在舉乙個例子是

fibonacci list

f(1)=1    f(0)=0

demo

public class

public static void main(string args) }

}

費波納切更能展現出編譯原理中編譯器的執行結構。

費波納切執行結構非常惱火

但是通過費波納切可以記得乙個重要點是當進入棧的時候,函式的執行起點同時被儲存

儲存的要素有三個

函式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)

斐波那契數列排列後類似如下形式

編譯安裝原理理解

configure從程式檔案角度出發是乙個可執行指令碼,執行此指令碼是為了生成makefile檔案,這個檔案是乙個相當於定的規矩的檔案,也就是顯式規則說明,在此可通過在configure後新增引數拉對安裝進行控制,比如說將配置檔案放在某個目錄下,將日誌檔案放在某個目錄下等,這個指令碼檔案的執行也是對...

程式編譯和鏈結原理理解

一 本書解決的問題 本書主要介紹系統軟體的執行機制和原理,涉及在windows和linux兩個系統平台下,乙個應用程式在編譯 鏈結 和執行時所做的事,具體如下 1.windows和linux作業系統下各自的可執行檔案 目標檔案格式?2.普通的c c 程式 如何編譯成目標檔案及程式的目標檔案如何儲存?...

CSS 原理理解

網頁製作最初,html規定了 normal document stream 標準文件流 來規範元素在網頁中的顯示法則 標準文件流中元素分兩種 塊內元素,行內元素。行內元素的特點 span標籤 豎直margin中的塌陷現象,上下緊密排列的元素的外邊距並不是兩個元素外邊距之和,而是選取那個最大的外邊距作...