2012-10-13 41 views
2

我想了解如何在函數中傳遞函數作爲參數,但我在理解教程方面遇到了很多麻煩。 這裏就是我想要做的事:方案中的簡單高階函數

(define (addone n) 
(+ n 1)) 
(define (for-n start stop fn) 
(if (< start stop) 
    (list) 
    (cons (fn start) (for-n (+ start 1) stop fn)))) 

基本上我只是想返回FN的值啓動功能,啓動+ 1,...起動+停機在列表中。

因此(for-n 1 5(addone 0))的預期輸出將是(1 2 3 4 5)。 我想我在這裏真的錯過了一些非常基本的概念,因爲我似乎甚至沒有正確地調用解釋器中的函數,而且我也沒有掌握如何告訴方案將fn解釋爲函數而不是僅僅定期參數。

我想通了(雖然通過純粹的試驗和錯誤),我不知道我做了什麼,但至少它的工作原理!

(define (function x) 
    x) 
(define (for-n start stop fn) 
    (if (> start stop) 
    (list) 
    (cons (fn start) (for-n (+ start 1) stop fn))))) 
+0

你有隻是問問題的問題並讓他們不加討論......受訪者把他們的寶貴時間放在回答你的問題上,讓他們像這樣,毫不動搖或不被接受......這是否合理? – 0decimal0

回答

1

函數調用(addone 0)等於值1。如果你想通過功能addone本身(而不是1),不要把它包裝在圓括號中。 (for-n 1 5 addone)addone函數傳遞給for-n。如果您將圓括號括起來,Scheme將調用addone並傳遞結果。

1

一些反饋,讓你知道什麼是錯了你的第一個版本:

  • 基本情況的遞歸是建立一個列表平時一般返回'(),而不是(list)
  • 正如你已經發現,基本情況的條件是錯誤的:遞歸結束時(> start stop)而不是當(< start stop)最初陳述
  • 沒有必要定義addone過程,至少在一些Scheme解釋器已經存在還有一個叫add1
  • 最後,調用接收其它過程的過程時,只需沿着功能通過程序,無須先申請它 - 它返回一個值不是一個函數如預期。我的意思是說這是錯誤的:(for-n 1 5 (addone 0))這是正確的:(for-n 1 5 addone)。當你寫(addone 0)函數被應用並返回值1,你打算通過的是addone,程序本身。

有了上述所有的建議,這是一個正確的做法應該是什麼樣子:

(define (for-n start stop fn) 
    (if (> start stop) 
     '() 
     (cons (fn start) (for-n (add1 start) stop fn)))) 

這樣稱呼它:

(for-n 1 5 add1) 
> '(2 3 4 5 6)