2013-04-17 77 views
2

當您使用foldr時,您使用的過程有2個參數,列表和累加器的當前值。假設你迭代的列表是一列數字列表,長度相同。然後在迭代它們時,您想要乘以相同索引的數字並將其存儲爲累加器。如何在計劃中使用foldr?

如果您在foldr中使用lambda (x acc) (map * x acc),則這會失敗,因爲acc我認爲在開始時是一個空列表。你如何處理這樣的基礎案例?

回答

0

假設你有一個列表的列表如下:

((1 2 3) (2 3 5) (3 5 7)) 

你想將其降低到:

(6 30 105) 

我就簡單的做:

(define-syntax mul 
    (syntax-rules() 
     ((_ (lists ...)) (map * 'lists ...)))) 

的,你可以使用方法如下:

(mul ((1 2 3) (2 3 5) (3 5 7))) ; => (6 30 105) 

上面的代碼簡單地擴展爲:

(map * '(1 2 3) '(2 3 5) '(3 5 7)) 

然後你就可以在結果列表倍。例如:

(foldr + 0 (mul ((1 2 3) (2 3 5) (3 5 7)))) ; => 141 
4

這可以通過使用foldr沒事來解決,關鍵是在一開始就正確初始化累計值。沒有必要在這裏做花哨的東西(如宏)!

(define lst '((1 2 3) (2 3 5) (3 5 7))) 

(foldr (lambda (x acc) (map * x acc)) 
     (car lst) 
     (cdr lst)) 

=> '(6 30 105) 

當然,如果列表爲空(car lst)將失敗。因此,在調用foldr之前,您可能需要將空列表作爲單獨的案例處理。

+0

+1現在爲什麼我沒有想到過! -_- –