埋め込まれたリストの数値を合計するスキームで関数を作成する方法は?
すなわち ((1) (2 3) (4) (5 6))
通常のリストを合計するためにこれを書きました:
(define (sum list)
(if (null? list)
0
(+ (car list) (sum (cdr list)))))
しかし、埋め込みの方法がわかりません。
埋め込まれたリストの数値を合計するスキームで関数を作成する方法は?
すなわち ((1) (2 3) (4) (5 6))
通常のリストを合計するためにこれを書きました:
(define (sum list)
(if (null? list)
0
(+ (car list) (sum (cdr list)))))
しかし、埋め込みの方法がわかりません。
3 つのケースがあります。
(define (my-sum lst)
(cond
; 1. the list is empty, so finish of by adding 0
([empty? lst] 0)
; 2. the first element is a list, so recurse down on the sublist, then do the rest
([list? (car lst)] (+ (my-sum (car lst)) (my-sum (cdr lst))))
; 3. add the first element to the sum, then do the rest
(else (+ (car lst) (my-sum (cdr lst))))))
そのため、中間ケースが欠落していました。
これは、ネストの深さに関係なく機能します。
(my-sum '((1) (2 3) (4) (5 6)))
=> 21
(my-sum '((1) (2 3) (4) (5 6 (7 8 (9)))))
=> 45
ビルトイン プロシージャの影にならないように、"sum" と "list" という名前を使用しないでください。
より機能的な方法で
; this sums the elements of a not-embedded list
(define (sum-list* l)
(foldl + 0 l))
; this sums the elements of an embedded list
(define (sum-embedded-list* el)
(foldl + 0 (map sum-list* el)))
((a1...an) (b1...bn)...) のように形成されたリストの場合をカバーします。ここで、ai と bj はアトムです。Foldl と map は、scheme (および他の言語) における 2 つの重要な関数です。それらの使い方がわからない場合は、学ぶ必要があります。こちらをご覧ください