例如,在遞歸調用Scheme期間`let`創建的局部變量的狀態是否改變?
我想檢查一個元素是否在列表中。該算法很簡單,讓我們做它在C++
bool element_of(const std::vector<int>& lst, int elem) {
for(int i(0), ie = lst.size(); i < ie; ++i)
if(elem == lst[i])
return true;
return false;
}
由於計劃不要讓我使用單if
聲明,我不能做類似於上面的C++代碼的東西。然後我想出了一個臨時變量,即result
。 result
將有初始值#f
,接下來我遞歸調用該函數來檢查列表中的下一項,即cdr lst
...因此,我的問題是,每當它進入一個新函數時,用let
創建的變量是否恢復其初始值呼叫或其值保持不變直到最後一次呼叫?
在另一方面,使用fold
,我的解決辦法是,
(define (element-of x lst)
(fold (lambda (elem result)
(if (eq? elem x) (or result #t) result))
#f
lst))
感謝,
謝謝。所以我猜想Scheme的局部變量的機制就像命令式語言一樣。 – Chan 2011-04-24 05:11:33
Sort of ... Scheme的環境模型是必需的,因爲Scheme不是一種「純粹的」功能語言,因爲它確實允許變量的可變性。基本上所有的變量都是在「環境」中保存的符號,它基本上是一個符號表。 '(define a b)'關鍵字爲本地環境(符號表)添加符號「a」,並將其綁定到「b」的計算值。再次在'a'上調用'define'會將'a'重新綁定到別的東西,除非您在新環境中調用它,在這種情況下,它會在符號表中添加一個新的'a',掩蓋舊的可用性值。 – Jason 2011-04-24 05:26:33
有關計劃環境模型的更多信息,請查看以下鏈接:http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer- programs-spring-2005/lecture-notes/lecture15webhan.pdf – Jason 2011-04-24 05:27:56