あなたはこのように、loop
を使用することができます。
(defun running-sum (xs)
(loop with sum = 0
for x in xs
collect (setf sum (+ sum x))))
(running-sum '(1 2 3 4))
それは基本的に同じものだが、それは代わりにグローバルなもののローカル変数を使用し、より明確であるかもしれません。
また、あなたは再帰関数を定義し、ラッパー関数ができます
(defun running-sum-recursive (xs)
(running-sum-recursive2 0 xs))
(defun running-sum-recursive2 (sum xs)
(if (eq xs nil)
nil
(let ((new-sum (+ sum (car xs))))
(cons new-sum (running-sum-recursive2 new-sum (cdr xs))))))
(running-sum-recursive '(1 2 3 4))
loop
が利用可能な場合しかし、これは私には不必要に複雑なようです。 Haskellで、あなたはこのような実行中の合計を行うことができることを
注:
runningSum xs = scanl1 (+) xs
runningSum [1, 2, 3, 4]
ここで重要なのはscanl1
functionです。 Lispに似たようなものが存在する可能性がありますが(今は2回書いていますが)しばらくLispを使用していません。
編集:
(defun scanl (f val xs)
(loop for x in xs
collect (setf val (funcall f val x))))
(defun scanl1 (f xs)
(cons (car xs)
(scanl f (car xs) (cdr xs))))
(scanl1 #'+ '(1 2 3 4))
編集:いくつか検索した後、私はので、ここで彼らは、Common Lispのはかなりscanl
またはscanl1
ようなものを含んでいるとは思いませんかループについての提案のためのhuaiyuanの答えのおかげで短縮することができます。
ああ、そうですループを少し締め付けることができます。 +1投票。しかし、initは単に初期値としてだけでなく、現在の値としても使われていないので、それを反映するために名前を変更することをお勧めします。 'value'、' val'、または 'v'おそらく? –
これはクールです!ありがとう。 – ramgorur