【发布时间】:2020-09-05 06:37:55
【问题描述】:
这是一个生成元素列表排列的 Scheme 代码:
(define (remove x lst) (cond
((null? lst) '())
((= x (car lst)) (remove x (cdr lst)))
(else (cons (car lst) (remove x (cdr lst))))))
(define (permute lst) (cond
((= (length lst) 1) (list lst))
(else (apply append
(map (lambda (i)
(map (lambda (j) (cons i j))
(permute (remove i lst)))) lst)))))
如果我们将代码拆开,我确实了解代码的每个部分,但我无法理解的是这一切如何导致生成排列?
假设我们取列表‘(a b),它是如何生成‘(a b)和‘(b a)的?
我们首先从列表中删除a,然后b 保留,但是在哪里写到你现在必须将a 改为b? b 是单个元素,但在我对代码的解释中,b 也将被删除,什么都没有了……
【问题讨论】:
-
理解代码的第一步是将其格式化以供人类使用。把它分成几行,适当地缩进。你将无法阅读这个矩形的东西,我们也不会。有几个编辑器对方案(vim,emacs,...)具有完全合理的自动缩进。
-
@dratenik 这只是部分他们的错,但主要是SO formatting fault。在小修复之后,剩下的有点特殊,是的,但格式仍然很可读。
-
see this 以获得相关见解。
(apply append (map f xs))==(flatmap f xs). -
@alinsoar OP 已经提供了一个定义,他们一般不会问如何实现这个。它在列表中,而在例如数组它可以完全不同。所以我不明白你删除这两个标签。
-
@alinsoar 这个特定问题是关于列表排列的给定定义。我正在恢复标签,我觉得它们非常相关。 .... 好的,我取出了列表标签。 :)
标签: scheme permutation definition