在Scheme中的递归过程中合并列表

时间:2016-03-19 23:16:41

标签: scheme racket

我正在尝试执行以下操作 - 我有一个功能,收到一个列表和一个数字, 对于这个数字的每个出现,它应该在输出列表中复制它, 这是我到目前为止所做的:

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

但是对于这两个输入,它只返回以下内容:

'(6 6 x)

我在这里做错了什么? 提前谢谢!

1 个答案:

答案 0 :(得分:2)

有几个问题:

  1. 您错误地使用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))]))
    
  2. 你编写一个没有基本情况的递归函数!如果我致电(extendList '() 6)会怎样?

  3. (list num num (extendList nextData num))将创建一个包含三个元素的列表。我不认为这是你真正想要的。您可能希望使用list*cons。其他分支也会出现同样的问题。