簡體   English   中英

方案遞歸或迭代

[英]Scheme recursive or iterative

(define unique?
  (lambda (l)
    (or (null? l) 
        (null? (cdr l))
        (and (not (in? (car l) (cdr l))) 
             (unique? (cdr l)))))

有人可以告訴我這是迭代程序還是遞歸程序? 我想這是迭代的,但我不確定,我也不知道該如何解釋

您的代碼顯然是遞歸的,因為它是unique? 通話unique? 程序unique? 如果遞歸調用發生在尾部位置,則將是迭代的。 R6RS標准,請參見第11.20節“尾調用和尾上下文”,詳細介紹了每種語法形式的尾上下文。 分析您的lambda我們認為是:

  • lambda的最后一個lambda是尾部上下文,因此您的or ...是尾部表達式
  • 在最后一個表達式or一個尾巴表情,讓你and ...是尾部的表達
  • 在最后的表達and是尾表情,讓你的unique? 是尾聲

因此, unique? 稱自己為尾部調用,因此是迭代的。

該函數是遞歸的,因為它會自行調用。 但是請注意,由於它是尾遞歸的,因此可以將其編譯為迭代形​​式。

函數成為尾部遞歸的標准僅是在遞歸調用返回后無需執行任何操作,這在您的情況下是正確的。

如何將尾遞歸函數轉換為循環

要將尾遞歸函數轉換為while循環,請遵循以下步驟。 (沒有將任意遞歸函數轉換為while循環的自動函數,您必須先將其轉換為尾遞歸函數。)

  1. 將助手功能參數轉換為局部變量; 它們的初始值與從主函數調用助手函數的初始值相同。
  2. 對於導致進行尾遞歸調用的方向,continue測試與helper函數中的測試相同。 (如果尾遞歸調用出現在if的else部分中,則添加一個不包含的調用。)
  3. 身體用套裝! 更新每個變量的值; 這些值與傳遞給尾遞歸調用的參數相同。
  4. 返回累加器的值; 這是在while循環之后。

來源: 尾遞歸和循環

由於其他兩個答案說明了什么以及為什么您的函數是尾遞歸的; 我將為初學者留下一個簡單的方法來記住它們之間的區別:

- 遞歸函數 不會在遞歸調用運行

尾遞歸函數 的確對遞歸調用起作用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM