2013-02-02 58 views
6

我正在學習有關遞歸和我碰到這個問題就來了:語言必須支持遞歸的屬性是什麼?

FORTRAN implementations do not permit recursion because 

a. they use static allocation for variables 

b. they use dynamic allocation for variables 

c. stacks are not available on all machines 

d. it is not possible to implement recursion on all machines. 

我發現答案是(A)

但我想知道所有的編程語言應該具有的特徵支持遞歸。

可以請人解決我的疑惑

感謝事先在函數或子程序(包括它的返回地址)

+0

同意,歡迎來到scicomp並感謝您的提問。爲了迴應Deer Hunter所說的一切,我們在這個社區有很多Fortran用戶,但我們通常不會處理這樣的一般編程問題。我將把這個移到StackOverflow。 –

+0

好吧,我明白了。感謝您的舉動 –

+2

我猜你唯一需要的是:每個函數調用的函數和局部變量和參數存儲空間。點a。在你的問題似乎表明,存儲空間重用函數調用。 – jackrabbit

回答

4

局部變量應該是一個新的副本時,它被調用。

通常這是使用堆棧架構完成的。每當一個函數被調用時,它的參數被壓入堆棧,然後它的返回地址被壓入,然後一塊內存也被「推」(通過遞減足夠的堆棧指針)。 一個特殊的寄存器,「幀指針」被設置指向該內存,並且該函數通過引用該寄存器來引用其所有局部變量。

其他語言不使用物理硬件堆棧,而是邏輯實現爲鏈接列表,但原理相同。

由於原Fortrans沒有這個概念,並且將所有變量存儲在固定的全局位置,所以遞歸調用會崩潰或掛起。例如,如果A調用B調用C調用B,則B返回C,C返回B,C返回C,因爲B只能記住一個返回地址。

calls: A -> B -> C -> B 

returns:  B <- C <- B 
      B -> C 

更重要的是,當第二次調用B發生時,第一次調用B的所有局部變量和參數都會被破壞。

1

提問者詢問的多項選擇題是一個誤導性問題,因爲雖然該語言的最舊版本缺少遞歸支持,但現代版本的FORTRAN語言允許遞歸。

語言實現是否支持遞歸應該被認爲是語言方言定義函數的方式以及實現一致性程度的問題。