recursion - 方案:给定列表的列表和排列,排列

标签 recursion functional-programming scheme permutation

我正在练习编程范例考试并解决问题集,我遇到了这个问题。这是递归地反转和连接列表后的第一个问题,所以我想有一个优雅的递归解决方案。

我得到了一个列表列表和一个排列。我应该对每个列表进行排列,包括具有指定排列的列表列表。

我举了一个例子:

->(permute '((1 2 3) (a b c) (5 6 7)) '(1 3 2))
->((1 3 2) (5 7 6) (a c b))

我什至不知道如何开始。我需要用递归解释来表述问题才能解决它,但我不知道如何解决。

最佳答案

好吧,让我们看看如何解决这个问题。我们得到一个列表列表和一个数字列表,我们希望根据数字列表指定的顺序对每个列表进行排序:

=>(permute '((1 2 3) (4 5 6)) '(3 2 1))
'((3 2 1) (6 5 4))

我们可以看到列表列表中的每个列表都可以单独处理,它们的解决方案彼此无关。因此,我们可以有一个帮助器 permute1 来处理一个列表的情况,然后使用 map 将此函数应用于每个列表(每次都具有相同的顺序):

(define (permute lists ordering)
  (map (lambda (xs) (permute1 xs ordering))
       lists))

(define (permute1 items ordering)
  ...)

现在,计算 (permute1 '(4 5 6) '(3 2 1)),我们的意思是:

  1. 新列表的第一项将是 items 的第 3 项,因为 ordering 中的第一个数字是 3.
  2. 新列表中的其余项目将通过使用排序中的其余数字来确定。
  3. 如果排序为空列表,则返回空列表。

这形成了基本情况 (3)、递归情况 (1) 以及更深层次递归的步骤 (2)。因此,我们的解决方案的草图如下所示:

(define (permute1 items ordering)
  (if (empty? ordering)
      '()
      (let ([next-item ???])
        (??? next-item
             (permute1 items (rest ordering))))))

其中 ??? 分别表示根据 ordering 中的第一个数字获取项目,并将该项目与计算的其余部分相结合。

关于recursion - 方案:给定列表的列表和排列,排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387080/

相关文章:

c++ - 通过作为类的公共(public)成员的两个函数传递一个函数作为参数

r - 用户定义的函数,用于分析多个 csv、创建变量并在 R 中按组对 NA 进行计数

scheme - Racket:用一个函数改变两个常量

java - 如何获得斐波那契递归的时间

java - 使用星号向前和向后打印直角三角形?

.net - 选择是否对 F# 中的小型 AST 使用可区分联合或记录类型

python - python->scheme转换的问题

clojure - 无参数(和)返回 t

C 递归中使用if或while的区别

java - 删除二叉树——设计建议