2014-01-09 3 views
2

У меня есть функция, которая принимает шесть восьмеричных (0-7) цифр в качестве аргумента и возвращает true или false.запись цикла, который заканчивается при каждой попытке перестановки

Я хотел бы запустить цикл, который пробует каждую перестановку значений 0-7 и подсчитывает число «истинных» возвратов.

что-то вроде:

function count_possibles() 
local count=0 
local a,b,c,d,e,f=0,0,0,0,0,0 
while possiblepermutations > 0 do 
    if compare(a,b,c,d,e,f) == true then count = count +1 end 
    permute(a,b,c,d,e,f) 
    possiblepermutations = possiblepermutations -1 
return count 
end 

Я пытался играть с примерами, приведенными в http://www.lua.org/pil/9.3.html но это все о переборе над столиками, не совсем то, что я делаю.

Я не обязательно забочусь о производительности, эта функция предназначена для проверки функции сравнения, которую я написал.

Есть ли простой способ зацикливаться до тех пор, пока не будут проверены все возможные перестановки?

+0

Вы имеете в виду фактические перестановки символов '0' - '7', где в перестановке каждый символ появляется ровно один раз? Или все массивы шести восьмеричных цифр в порядке? – mpeterv

+2

Кроме того, связанная глава PiL имеет именно ту функцию, которая вам нужна. Вы можете поместить восьмеричные цифры в массив, а затем передать его функции «permgen», чтобы получить итератор. – mpeterv

+0

Я так не думал об этом, я считаю, что ты прав. – ridthyself

ответ

3

Прямой метод может показаться хорошо, учитывая указанные требования:

local count = 0 
local total = 0 
for a = 0, 7 do 
    for b = 0, 7 do 
     for c = 0, 7 do 
      for d = 0, 7 do 
       for e = 0, 7 do 
        for f = 0, 7 do 
         total = total + 1 
         if compare(a,b,c,d,e,f) == true then count = count +1 end 
        end 
       end 
      end 
     end 
    end 
end 
return count, total 

Конечно, это не имеет ничего общего с перестановками. Я высказался за противоречивое требование (как видно из кода вопросчика), что первые параметры - 0,0,0,0,0,0.

Смежные вопросы