algorithm - 方案中的循环排列

标签 algorithm recursion scheme racket circular-permutations

你好,我尝试使用递归在 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/

相关文章:

lambda - DrRacket : lambda anonymous function

clojure - 如何美化Lisp源代码?

algorithm - 在 OpenCL 1.2 上实现堆栈推送的正确方法是什么?

java - 为什么这个循环排序实现有一个错误?

c++ - 使用divide et impera 算法检查 vector 是否有序

algorithm - Miller-Rabin Scheme 实现不可预测的输出

performance - 如何降低 O(N^2) C-index 函数的时间复杂度?

algorithm - 给定 x,我怎样才能找到加起来为 x 的所有四个数字的集合

java - 汉诺塔递归算法

c++ - 递归地反转字符串中的单词