簡體   English   中英

球拍:為嵌套列表的每個元素添加一個數字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM