您的代碼不使用任何類型的循環。爲了獲得所有的事件,你必須以某種方式迭代。
在方案中,這通常通過遞歸使用named let
來完成。在每次迭代期間,您都有一個索引變量i
,結果列表r
和其餘輸入列表L
,在每個迭代步驟中該列表變小。
您示例中的if
子句可以簡化。
如果您在列表的第一個元素中找到值,則增加索引,將當前索引附加到結果列表並繼續輸入列表的其餘部分。
如果您沒有匹配,那麼請增加索引,但不要將索引添加到結果列表中,並繼續使用剩餘的輸入列表。
當L
爲空時,您已到達輸入列表的末尾。在這種情況下返回結果列表。您必須翻轉結果列表,因爲cons
會在開始處追加。
(define positions
(lambda (A L)
(let loop ((i 0)
(r '())
(L L))
(if (null? L)
(reverse r)
(if (eq? (car L) A)
(loop (+ i 1) (cons i r) (cdr L))
(loop (+ i 1) r (cdr L)))))))
通過將if子句放入循環的參數中,可以避免輸入兩次循環命令。
(define positions
(lambda (A L)
(let loop ((i 0)
(r '())
(L L))
(if (null? L)
(reverse r)
(loop (+ i 1)
(if (eq? (car L) A)
(cons i r)
r)
(cdr L))))))
順便說一句:Scheme不是靜態類型爲C或Java。這意味着您不需要在保留變量值中編碼錯誤,因爲它在C中用-1完成。在計劃中,您返回假#f
或空列表'()
或者您輸入(error "Sorry")
錯誤。
提示:嘗試使用正確對齊表達式的編輯器。這簡化了Scheme的生活。例如,試試[Emacs](http://emacs.stackexchange.com/)。 – ceving
尤其是'emacs'和'paredit'。 –