Recursion 球拍:为嵌套列表的每个元素添加一个数字

Recursion 球拍:为嵌套列表的每个元素添加一个数字,recursion,racket,Recursion,Racket,我试图递归地编写这个函数。请让我知道在Racket文档中是否有用于此的库函数。尝试向嵌套列表的每个原子元素添加一个数字。我保证名单只有两层 (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)

我试图递归地编写这个函数。请让我知道在Racket文档中是否有用于此的库函数。尝试向嵌套列表的每个原子元素添加一个数字。我保证名单只有两层

(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
条件块中,但我不确定如何“取消”尾部部分以获得我想要的有一种比递归更简单的方法:

(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)))

如果有人知道此操作的库函数,请同时回答

有一种比递归更简单的方法:

(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)))

如果有人知道此操作的库函数,请同时回答

我认为这个问题可以概括为“如何映射嵌套列表?”

我的假设是,该程序还应向顶层元素添加数字,例如:
(添加到所有1'(12(34)5))
产生
'(23(45)6)

以下是基于以下问题的递归解决方案:

(定义(添加到所有x li)
(续)
[(数字?li)(+li x)]
[(列表?li)(映射(咖喱添加到所有x)li]
[李])
更普遍的解决方案:

(定义(映射*过程)
(用于/列表([elem ls])
(如果(列表?要素)
(地图*程序元素)
(proc elem)
(定义(添加到所有x li)
(定义(过程)
(如有)(编号?e)
(+Xe)
e) )
(地图*proc li))

我在标准的Racket库中没有看到像
map*
这样的过程,但我只查找了几分钟:)。

我认为这个问题可以概括为“如何映射嵌套列表?”

我的假设是,该程序还应向顶层元素添加数字,例如:
(添加到所有1'(12(34)5))
产生
'(23(45)6)

以下是基于以下问题的递归解决方案:

(定义(添加到所有x li)
(续)
[(数字?li)(+li x)]
[(列表?li)(映射(咖喱添加到所有x)li]
[李])
更普遍的解决方案:

(定义(映射*过程)
(用于/列表([elem ls])
(如果(列表?要素)
(地图*程序元素)
(proc elem)
(定义(添加到所有x li)
(定义(过程)
(如有)(编号?e)
(+Xe)
e) )
(地图*proc li))

我在标准球拍库中没有看到像
map*
这样的过程,但我只查找了几分钟:)。

列表是2深还是N深,其实并不重要,算法可以是相同的

(定义(添加到所有x x x)
(cond((null?xs)
空)
((列表?(车辆xs))
(缺点(添加到所有x(车辆x))
(添加到所有x(cdr x)))
(其他
(cons(+x(汽车x))
(添加到所有x(cdr xs(()()())))
(加上所有10’((12)(34)(5(6)(7(8)(9)))))
;; '((11 12) (13 14) (15 (16 (17 18 19))))
该过程可以推广到允许对嵌套列表的所有原子执行任何操作

(定义(映射*f xs)
(cond((null?xs)
空)
((列表?(车辆xs))
(cons(地图*f(汽车X))
(地图*f(cdr-xs)))
(其他
(cons(f(X车))
(地图*f(cdr xs(()())))
(定义(添加到所有x x x)
(地图*(咖喱+x)xs)
(加上所有10’((12)(34)(5(6)(7(8)(9)))))
;; '((11 12) (13 14) (15 (16 (17 18 19))))

无论列表是2-deep还是N-deep,都不重要,算法可以是相同的

(定义(添加到所有x x x)
(cond((null?xs)
空)
((列表?(车辆xs))
(缺点(添加到所有x(车辆x))
(添加到所有x(cdr x)))
(其他
(cons(+x(汽车x))
(添加到所有x(cdr xs(()()())))
(加上所有10’((12)(34)(5(6)(7(8)(9)))))
;; '((11 12) (13 14) (15 (16 (17 18 19))))
该过程可以推广到允许对嵌套列表的所有原子执行任何操作

(定义(映射*f xs)
(cond((null?xs)
空)
((列表?(车辆xs))
(cons(地图*f(汽车X))
(地图*f(cdr-xs)))
(其他
(cons(f(X车))
(地图*f(cdr xs(()())))
(定义(添加到所有x x x)
(地图*(咖喱+x)xs)
(加上所有10’((12)(34)(5(6)(7(8)(9)))))
;; '((11 12) (13 14) (15 (16 (17 18 19))))

我不知道你可以像那样在
条件中使用括号。我向上投票:)我不知道你可以在
条件中使用括号。我投赞成票:)