[英]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循環的自動函數,您必須先將其轉換為尾遞歸函數。)
- 將助手功能參數轉換為局部變量; 它們的初始值與從主函數調用助手函數的初始值相同。
- 對於導致進行尾遞歸調用的方向,continue測試與helper函數中的測試相同。 (如果尾遞歸調用出現在if的else部分中,則添加一個不包含的調用。)
- 身體用套裝! 更新每個變量的值; 這些值與傳遞給尾遞歸調用的參數相同。
- 返回累加器的值; 這是在while循環之后。
來源: 尾遞歸和循環
由於其他兩個答案說明了什么以及為什么您的函數是尾遞歸的; 我將為初學者留下一個簡單的方法來記住它們之間的區別:
尾 - 遞歸函數 不會在遞歸調用運行 。
非 尾遞歸函數 的確對遞歸調用起作用 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.