Lisp 生成列表的排列

Lisp 生成列表的排列,lisp,scheme,permutation,Lisp,Scheme,Permutation,我正在编写一个函数,它接受一个列表并返回一个参数排列列表 我知道如何使用一个函数来删除一个元素,然后递归地使用该函数来生成所有置换。我现在遇到一个问题,我想使用以下函数: (define (insert-everywhere item lst) (define (helper item L1 L2) (if (null? L2) (cons (append L1 (cons item '())) '()) (cons (append L1 (cons item L2)

我正在编写一个函数,它接受一个列表并返回一个参数排列列表

我知道如何使用一个函数来删除一个元素,然后递归地使用该函数来生成所有置换。我现在遇到一个问题,我想使用以下函数:

(define (insert-everywhere item lst)
  (define (helper item L1 L2)
    (if (null? L2) (cons (append L1 (cons item '())) '())
        (cons (append L1 (cons item L2)) 
              (helper item (append L1 (cons (car L2) '())) (cdr L2)))))
  (helper item '() lst))
此函数将项目插入列表的每个可能位置,如下所示:

(insert-everywhere 1 '(a b)) 
将获得:

'((1 a b) (a 1 b) (a b 1))
如何使用此函数获取列表的所有排列

我现在有:

(define (permutations lst)
  (if (null? lst) 
      '()
      (insert-helper (car lst) (permutations (cdr lst)))))

(define (insert-helper item lst)
  (cond ((null? lst) '())
        (else (append (insert-everywhere item (car lst)) 
                    (insert-helper item (cdr lst))))))
但是执行
(排列(1 2 3))
只会返回空列表
”()

首先,构造一系列相关示例:


找出每个答案与前面的答案之间的关系。也就是说,如果给出了上一个答案(对于列表的尾部)和列表顶部的新元素,您如何计算每个答案?

这里有一个函数,它生成所有大小为“size”的数字排列,它由列表“items”中的元素组成

(define (generate-permutations items size)
  (if (zero? size)
      '(())
      (for/list ([tail (in-list (generate-permutations items (- size 1)))]
                 #:when #t
                 [i (in-list items)]
                 #:unless (member i tail))
        (cons i tail))))

我明白了,所以每个答案都是当前列表中插入到前一个列表所有排列位置的汽车。那么,我该如何将insert WHERYERY函数应用于上一个列表的每个排列?@EricMercer,作为辅助函数听起来不错。对不起,你能澄清一下吗?我还不知道该怎么办?@EricMercer,你刚才描述了一个子问题:给定一个值和一个列表列表,生成一个该值的列表列表,插入到输入列表中每个列表的每个可能位置。通过定义一个辅助函数来处理它。从创建一系列相关示例开始,等等。注意,您的辅助函数不需要了解任何关于置换的知识;列表的输入列表可以是任何内容。您的辅助函数甚至可能需要它自己的辅助函数。我编写了辅助函数和置换函数,但有些功能仍然不起作用。当我做(排列’(1 2 3))时,它只会给我一个空列表’()请参阅我编辑的文章,了解两个相关的新函数:
(define (generate-permutations items size)
  (if (zero? size)
      '(())
      (for/list ([tail (in-list (generate-permutations items (- size 1)))]
                 #:when #t
                 [i (in-list items)]
                 #:unless (member i tail))
        (cons i tail))))