[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Too many permutations computed
From: |
uzibalqa |
Subject: |
Too many permutations computed |
Date: |
Tue, 01 Aug 2023 18:45:08 +0000 |
I have implemented the computations of permutations of a string using the heap
algorithm.
But I am getting repetitions, which should not happen. There could be some
problems in the
way the recursive calls are handled, and the result list is not being updated
correctly.
(defun permute-strg-heap (strg h &optional result)
"Generate all permutations of string STRG using recursive
backtracking."
(if (null result) (setq result '()))
(if (= h 1)
(progn
(push (copy-sequence strg) result) ; Output the permutation
(message "%s" strg))
(progn
(setq result
(permute-strg-heap strg (1- h) result))
;; Generate permutations for i-th swapped with each i-1 initial
(let ( (j 0) )
(while (< j h)
;; Swap choice based upon h (even or odd)
(if (evenp h)
(swap-chars strg j (1- h))
(swap-chars strg 0 (1- h)))
(setq result
(permute-strg-heap strg (1- h) result))
(setq j (1+ j))) )))
result)
This should be tho algorithm
procedure generate(k : integer, A : array of any):
if k = 1 then
output(A)
else
// Generate permutations with k-th unaltered
// Initially k = length(A)
generate(k - 1, A)
// Generate permutations for k-th swapped with each k-1 initial
for i := 0; i < k-1; i += 1 do
// Swap choice dependent on parity of k (even or odd)
if k is even then
swap(A[i], A[k-1]) // zero-indexed, the k-th is at k-1
else
swap(A[0], A[k-1])
end if
generate(k - 1, A)
end for
end if
Re: Too many permutations computed, tpeplt, 2023/08/03