在 Scheme 的递归过程中合并列表
Merging lists in recursive procedure in Scheme
我正在尝试执行以下操作 -
我有一个接收列表和数字的函数,
对于这个数字的每次出现,它应该在输出列表中复制它,
这是我目前所拥有的:
(define (extendList lst num)
(define data (car lst))
(define nextData (cdr lst))
(cond ((and (number? data)(= data num)) ( list num num (extendList nextData num)))
(list? data) (list (extendList data num) (extendList nextData num))
(else ( list data (extendList (cdr lst) num) ))))
问题是它只是没有在递归中再次调用这个函数——它所做的只是将下一个元素添加到输出中,
例如,这是我的输入和我的预期输出:
(extendList '(6 x y 6) 6) ; output should be: (6 6 x y 6 6)
(extendList '(6 x (y 6) 6) 6) ;output should be: (6 6 x (y 6 6) 6 6)
但对于两个输入,它只是 returns 以下内容:
'(6 6 x)
我在这里做错了什么?
提前致谢!
有几个问题:
你用错了cond
。 (list? data) (list (extendList data num) (extendList nextData num))
周围应该有一个括号
我建议在每个分支周围使用括号(括号和括号可以互换),这样更容易阅读:
(define (extendList lst num)
(define data (car lst))
(define nextData (cdr lst))
(cond
[(and (number? data)(= data num)) (list num num (extendList nextData num))]
[(list? data) (list (extendList data num) (extendList nextData num))]
[else (list data (extendList (cdr lst) num))]))
你写了一个没有基本情况的递归函数!如果我调用 (extendList '() 6)
会发生什么?
(list num num (extendList nextData num))
将创建一个包含三个元素的列表。我认为这不是您真正想要的。您可能想改用 list*
或 cons
。其他分支也会出现同样的问题。
我正在尝试执行以下操作 - 我有一个接收列表和数字的函数, 对于这个数字的每次出现,它应该在输出列表中复制它, 这是我目前所拥有的:
(define (extendList lst num)
(define data (car lst))
(define nextData (cdr lst))
(cond ((and (number? data)(= data num)) ( list num num (extendList nextData num)))
(list? data) (list (extendList data num) (extendList nextData num))
(else ( list data (extendList (cdr lst) num) ))))
问题是它只是没有在递归中再次调用这个函数——它所做的只是将下一个元素添加到输出中, 例如,这是我的输入和我的预期输出:
(extendList '(6 x y 6) 6) ; output should be: (6 6 x y 6 6)
(extendList '(6 x (y 6) 6) 6) ;output should be: (6 6 x (y 6 6) 6 6)
但对于两个输入,它只是 returns 以下内容:
'(6 6 x)
我在这里做错了什么? 提前致谢!
有几个问题:
你用错了
周围应该有一个括号cond
。(list? data) (list (extendList data num) (extendList nextData num))
我建议在每个分支周围使用括号(括号和括号可以互换),这样更容易阅读:
(define (extendList lst num) (define data (car lst)) (define nextData (cdr lst)) (cond [(and (number? data)(= data num)) (list num num (extendList nextData num))] [(list? data) (list (extendList data num) (extendList nextData num))] [else (list data (extendList (cdr lst) num))]))
你写了一个没有基本情况的递归函数!如果我调用
(extendList '() 6)
会发生什么?(list num num (extendList nextData num))
将创建一个包含三个元素的列表。我认为这不是您真正想要的。您可能想改用list*
或cons
。其他分支也会出现同样的问题。