2012-10-19 83 views
2

我對其他語言中的while循環很熟悉,但是在這裏我寫了一個計算術語總和的衍生物的小函數,但它只有前2個我想知道是否有辦法改變這個以考慮超過2?while循環在球拍?

表情,E,表示爲列表,以便2x + 2y + x^3表示爲(+ (* 2 x) (* 2 y) (expt x 3))

注意,我已經有功能寫入計算指數,但它是一個總和的一部分,第一2

後停止
(define (make-sum v1 v2) 
    (list '+ v1 v2)) 

(define (diff-sum x E) 
    (make-sum (diff x (first-operator E)) (diff x (last-operator E)))) 

回答

15

在專業水平的球拍中,for loops是一種標準的做法,可以按順序進行。例如,下面生成一個簡單的乘法表:

(define numbers (list 1 2 3 4 5 6)) 
(for/list ([item numbers]) 
    (list item (* item 2) (* item 3))) 

這是一個循環,對每個數字散步,對其進行處理,併產生結果的新名單。相當標準;幾乎所有的編程語言都有一個集合迭代的概念。

在你需要爲介紹性計算機科學課程寫作的那種球拍中,你可能不得不求助於顯式遞歸或更高階的函數,如map,取決於你的教師。表達迭代的其他方式與上面的循環具有相同的功能:我們只是稍微區別一些。

例如,相同的計算以創建小乘法表上面可以表示爲具有明確的遞歸如下:

(define (my-loop numbers) 
    (cond [(empty? numbers) '()] 
     [else 
     (define item (first numbers)) 
     (cons (list item (* item 2) (* item 3)) 
       (my-loop (rest numbers)))])) 
(my-loop numbers) 

,並含蓄地配合使用map

(define (f item) 
    (list item (* item 2) (* item 3))) 
(map f numbers)