list - 方案列表始终按相反顺序排列

标签 list recursion scheme r5rs

对于这里的大多数更高级的策划者来说,这可能是一个微不足道的问题,但作为一个新人,我发现这是一个问题。

我需要一种方法来构造一个新列表,其顺序与它进来时的顺序相同。举个例子,假设我们有一个列表'(1 2 0 3 4 0 0 5)。但是遍历列表并将 cdr 作为第一个参数传递回去最终会向后构造新列表。

这是代码示例:

我向它传递一个需要对其进行处理的“旧列表”,以及一个作为“新列表”形成并返回的空列表。

注意,去掉 0 只是作为新列表必须满足的“某些条件”

  (define (form-new-list old-list new-list)
    (cond ((null? old-list) new-list)
          (else
           (if (eq? (car old-list) 0) (form-new-list (cdr old-list) new-list)
               (form-new-list (cdr old-list) (cons (car old-list) new-list))))))

  ;test
  (form-new-list '(1 2 0 3 4 0 0 5) '()) ; gives (5 4 3 2 1)
  ;but want (1 2 3 4 5)

我不仅仅是想反转通过反向过程返回的列表,而是希望首先以正确的顺序将新列表放在一起。

是否有某种“技巧”,比如在其他地方进行递归调用?

非常感谢任何建议。

最佳答案

您正在寻找使用递归遍历列表的自然方法。使用此过程作为您的解决方案的模板 - 它只是简单地复制收到的列表:

(define (copy lst)
  (if (null? lst)
      '()
      (cons (car lst)
            (copy (cdr lst)))))

注意以下几点:

  • 当输入列表为空时,递归结束,并且考虑到我们正在构建一个新列表,返回的正确值是空列表
  • 我们有兴趣构建一个新列表,我们通过为输出列表构造一个新元素来实现此目的,在本例中,该新元素恰好是输入列表的第一个元素(其汽车零件)
  • 最后,通过使用输入列表的其余部分(其 cdr 部分)调用该过程来推进递归步骤

像往常一样,我最后对那些学习如何递归思考的人给出了答案,建议您看一下 The Little SchemerHow to Design Programs ,这两本书都会教你如何使用Scheme来理解一般的递归过程。

关于list - 方案列表始终按相反顺序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243360/

相关文章:

c# - 如何将列表转换为数据表

c++ - 静态变量没有增加

python - 汉诺塔,python -> 方案,显示错误。我错过了什么?

javascript - javascript 中所有可能的组合 - 为什么使用 pop()?

functional-programming - 计划作业

functional-programming - "or"的不同方案程序

python - 使用列表中的值作为另一个列表的索引的最pythonic方式

python - 如何命名将整数列表转换为对列表的函数?

java - Java中将二维数组的索引添加到List的末尾

algorithm - 这个断词算法的时间复杂度是多少? (动态规划)