我一直在教自己函數式編程,而且我正在使用摺疊編寫不同的高階函數。我卡住實施掃描(也稱爲前綴總和)。我用摺疊地圖實現的樣子:函數式編程 - 使用摺疊執行掃描(前綴總和)
(define (map op sequence)
(fold-right (lambda (x l) (cons (op x) l)) nil sequence))
,命中在掃描的樣子:
(define (scan sequence)
(fold-left (lambda (x y) (append x (list (+ y (car (reverse x)))))) (list 0) sequence))
我的觀察是,該「x」是結果數組,到目前爲止,「Y」是傳入列表中的下一個元素。這產生了:
(scan (list 1 4 8 3 7 9)) -> (0 1 5 13 16 23 32)
但是這看起來很醜陋,在lambda內產生的列表反轉。我更願意不在結果列表上進行全局操作,因爲我的下一個嘗試是嘗試並行化大部分(這是一個不同的故事,我正在查看幾個CUDA論文)。
有沒有人有更優雅的掃描解決方案?
BTW我實現摺疊左和摺疊式右邊是:
(define (fold-left op initial sequence)
(define (iter result rest)
(if (null? rest)
result
(iter (op result (car rest)) (cdr rest))))
(iter initial sequence))
(define (fold-right op initial sequence)
(if (null? sequence)
initial
(op (car sequence) (fold-right op initial (cdr sequence)))))
太棒了,那就是我一直在尋找的。 – 2010-02-23 01:14:45