你好,我尝试使用递归在 Scheme (Dr. Racket) 中进行循环排列。
例如,如果我们有 (1 2 3),循环排列给出 ((1 2 3) (2 3 1) (3 1 2))。
我写了一段代码,但我在转换时遇到了问题。
我的代码:
(define cpermit
(lambda (lst)
(cpermitAux lst (length lst))))
(define cpermitAux
(lambda (lst n)
(if (zero? n) '()
(append (cpermitAux lst (- n 1)) (cons lst '())))))
其中 (cpermit '(1 2 3)) 给出 '((1 2 3) (1 2 3) (1 2 3))
最佳答案
您可以使用移动列表的功能
(defun lshift (l) (append (cdr l) (list (car l))))
这会将您的列表向左移动。
在追加之前使用这个函数
(define cpermit
(lambda (lst)
(cpermitAux lst (length lst))))
(define cpermitAux
(lambda (lst n)
(if (zero? n) '()
(append (cpermitAux (lshift lst) (- n 1)) (lshift (cons lst '()))))))
关于algorithm - 方案中的循环排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38940465/