2011-05-25 19 views

回答

5

DO循環球拍有一個有趣的結構:

(do ([id init-expr step-expr-maybe] ...) 
    (stop?-expr finish-expr ...) 
    expr ...) 

的文檔R5RS提供了一個例子:

(let ((x '(1 3 5 7 9))) 
    (do ((x x (cdr x)) 
     (sum 0 (+ sum (car x)))) 
     ((null? x) sum))) 

這語句返回25,循環的元素的總和。 do循環中的x初始化爲let中的x,然後每次通過循環迭代設置爲cdrsum被初始化爲0,並且每次累積xcar的值。停止條件是迭代變量爲空時,返回值爲總和。好吧,除了方括號的球拍偏好外,這看起來不錯。有一個do循環和一個列表。循環在該列表上做了些什麼。我們可以用它來寫一個查找特定原子在列表的功能(使用球拍支架):

(define (find5 lst) 
    (do ([x lst (rest x)] 
     [found #f (or found (eq? 5 (first x)))]) 
    ((null? x) found))) 

相反初始化和增加值sum的,我orfound。另外,我更喜歡firstrest而不是carcdr,並且在他們不存在時自己定義它們。這個函數的工作方式應該從示例的解釋開始。

(find5 '(1 2 3 4 6)) 

給出#f,如預期。同樣地:

(find5 '(1 2 3 4 5 6)) 

給#t。

您是否能夠推廣在查找列表中的某個特定元素,並將do循環放入您的特定問題?

+0

是的,謝謝你的答案。我在計劃中並不熟悉cicle,我試圖理解,但我只理解簡單的函數,但是昨天我需要做一個函數,看看元素是否在第二個列表中。我無法做到這一點,因爲在不瞭解停工條件。 – gn66 2011-05-26 08:00:04

相關問題