[英]racket: add a number to each element of nested list
我試圖遞歸地編寫此函數。 請讓我知道Racket文檔中是否有用於此功能的庫函數。 嘗試向嵌套列表的每個原子元素添加數字。 我保證列表只有2個深度
(define (add_to_all x li) (cond
((number? li) (+ li x))
((and (=(len li)1) (number?(car li))) (list (add_to_all x (car li))))
((=(len li)1) (add_to_all x (car li)))
(else (list (add_to_all x (car li)) `(,@(add_to_all x (cdr li)))))))
用法示例:
(define list_of_lists `((1 2 3)(4 5 6)))
(add_to_all 1 list_of_lists)
錯誤:返回值的末尾有太多嵌套列表:
'((2 (3 (4))) (5 (6 (7))))
應該在哪里
'((2 3 4) (5 6 7))
我認為這個問題是在過去的else
條件塊,但我不知道如何“UNNEST”尾隨部分得到我想要的
列表是2深度還是N深度,都沒關系,算法可以相同。
(define (add-to-all x xs)
(cond ((null? xs)
null)
((list? (car xs))
(cons (add-to-all x (car xs))
(add-to-all x (cdr xs))))
(else
(cons (+ x (car xs))
(add-to-all x (cdr xs))))))
(add-to-all 10 '((1 2) (3 4) (5 (6 (7 8 9)))))
;; '((11 12) (13 14) (15 (16 (17 18 19))))
該過程可以通用化,以允許對嵌套列表的所有原子執行任何操作
(define (map* f xs)
(cond ((null? xs)
null)
((list? (car xs))
(cons (map* f (car xs))
(map* f (cdr xs))))
(else
(cons (f (car xs))
(map* f (cdr xs))))))
(define (add-to-all x xs)
(map* (curry + x) xs))
(add-to-all 10 '((1 2) (3 4) (5 (6 (7 8 9)))))
;; '((11 12) (13 14) (15 (16 (17 18 19))))
我認為這個問題可以概括為“如何映射嵌套列表?”。
我正在假設該過程還應該在頂級元素上添加數字,例如:( (add-to-all 1 '(1 2 (3 4) 5))
得出'(2 3 (4 5) 6)
。
這是基於該問題的遞歸解決方案:
(define (add-to-all x li)
(cond
[(number? li) (+ li x)]
[(list? li) (map (curry add-to-all x) li)]
[else li]))
更通用的解決方案:
(define (map* proc ls)
(for/list ([elem ls])
(if (list? elem)
(map* proc elem)
(proc elem))))
(define (add-to-all x li)
(define (proc e)
(if (number? e)
(+ x e)
e))
(map* proc li))
我在標准的Racket庫中沒有看到類似map*
的過程,但是只看了幾分鍾:)。
有一種比遞歸更簡單的方法:
(define (add x li)
(for/list ([e li]) (+ x e)))
(define (add_to_all x li)
(map (lambda(sublist)(add x sublist))
li))
用法:
(add_to_all 1 '((1 2 3)(4 5 6)))
如果有人知道此操作的庫函數,請也回答
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.