如何在方案的列表的元素之间包括相同的元素(nbr。或符号)?

时间:2019-05-27 00:52:50

标签: aiohttp

我现在开始了解方案的基础知识。我遇到了一个需要创建一个过程的练习,该过程需要在给定 list 的元素之间添加符号或数字的元素 x

例如:

过程(tech 7 (list 23 24 25))将导致(23 7 24 7 25)

到目前为止,我只有一种理论方法。它旨在将carcdr中的给定列表进行拆分,并将cdr与元素 x list 组合>通过append

(define (tech x lst)
  (if (null? lst)
      '()
      (cons (car lst) (append (cons ('x) (* 'x (length cdr lst))
                                    (cdr lst)))))

有人可以告诉我代码有什么问题吗?它只返回错误...

1 个答案:

答案 0 :(得分:1)

您的代码有几个问题:

  • 您应该避免使用append,大多数情况下,使用cons是构建列表的正确方法。
  • 您为什么将'x乘以列表的长度?那没有任何意义。
  • 您正在将符号 'xx 变量的 value 混淆。
  • 您需要考虑处理最后一个元素的第三种情况,因为列表没有以x结尾。
  • 最后但并非最不重要:您忘记了调用递归!如果您在tech内部省略对tech的呼叫,它将永远无法工作。

这解决了所有问题,大部分原始代码都必须重写:

(define (tech x lst)
  (cond ((null? lst) '())       ; base case: empty list
        ((null? (cdr lst)) lst) ; list with a single element
        (else (cons (car lst)   ; this is how we add
                    (cons x     ; the element to the list
                          (tech x (cdr lst))))))) ; advance recursion

它按预期工作:

(tech 7 '(23 24 25))
=> '(23 7 24 7 25)