當您使用foldr時,您使用的過程有2個參數,列表和累加器的當前值。假設你迭代的列表是一列數字列表,長度相同。然後在迭代它們時,您想要乘以相同索引的數字並將其存儲爲累加器。如何在計劃中使用foldr?
如果您在foldr
中使用lambda (x acc) (map * x acc)
,則這會失敗,因爲acc
我認爲在開始時是一個空列表。你如何處理這樣的基礎案例?
當您使用foldr時,您使用的過程有2個參數,列表和累加器的當前值。假設你迭代的列表是一列數字列表,長度相同。然後在迭代它們時,您想要乘以相同索引的數字並將其存儲爲累加器。如何在計劃中使用foldr?
如果您在foldr
中使用lambda (x acc) (map * x acc)
,則這會失敗,因爲acc
我認爲在開始時是一個空列表。你如何處理這樣的基礎案例?
假設你有一個列表的列表如下:
((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
這可以通過使用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
之前,您可能需要將空列表作爲單獨的案例處理。
+1現在爲什麼我沒有想到過! -_- –