亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

每個遞歸都能轉換成迭代嗎?

每個遞歸都能轉換成迭代嗎?

每個遞歸都能轉換成迭代嗎?A Reddit線程提出了一個明顯有趣的問題:尾遞歸函數可以很小地轉化為迭代函數。其他的,可以通過使用顯式堆棧進行轉換。能,會,可以每一,每個遞歸轉化為迭代?文章中的(計數器?)示例是對:(define (num-ways x y)   (case ((= x 0) 1)         ((= y 0) 1)         (num-ways2 x y) )) (define (num-ways2 x y)   (+ (num-ways (- x 1) y)      (num-ways x (- y 1))
查看完整描述

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

是否總是可以為每個遞歸函數編寫非遞歸形式?

是。一個簡單的形式證明就是證明預遞歸非遞歸演算(如Goto)都是圖靈完整的。由于所有圖靈完全計算器在表達能力上都是完全等價的,所以所有遞歸函數都可以用非遞歸圖靈全演算來實現。

不幸的是,我無法找到GotoOnline的一個好的、正式的定義,因此這里有一個:

Goto程序是一系列命令P寄存器機使.P如下之一:

  • HALT

    ,這將停止執行
  • r = r + 1

    哪里

    r

    是任何登記冊
  • r = r – 1

    哪里

    r

    是任何登記冊
  • GOTO x

    哪里

    x

    是個標簽
  • IF r ≠ 0 GOTO x

    哪里

    r

    是任何登記冊

    x

    是個標簽
  • 一個標簽,后面跟著上面的任何命令。

然而,遞歸函數和非遞歸函數之間的轉換并不總是那么簡單(除了調用堆棧的盲目手動重新實現)。

有關更多信息,請參見這個答案.


查看完整回答
反對 回復 2019-06-19
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

遞歸在實際的解釋器或編譯器中被實現為堆?;蝾愃频慕Y構。因此,您當然可以將遞歸函數轉換為迭代對應函數。因為它總是這樣做的(如果是自動的)..您將只是臨時地復制編譯器的工作,而且可能是以一種非常丑陋和低效的方式復制編譯器的工作。


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 2183 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號