пытаясь понять поколение перестановок - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь понять алгоритм перестановки, заданный здесь то, что я не ясно, с первым блоком псевдокода, где они упоминают

array = [1, 2, 3, 4]
function permutation(start, end):
#i will go from start to end
    for i -> (start, end+1):
        permutation(start+1,end)

почему end + 1 используется в цикле i, для меня не ясно, насколько я понимаю, end + 1 должен выходить за пределы индекса массива, к которому должна применяться перестановка, но здесь это не так это то, что мне не понятно.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018
for i -> (start, end+1)

Это означает итерацию для каждого значения, начиная с start , с автоматическим приращением и условием, удовлетворяющим end + 1

permutation(start+1,end)

Это точно такой же вызов функции со значениями начала и конца, переданными в него

например,

function permutation(start, end) 

с началом = 1 и концом = 10

Внутри foreach будет итерация, начиная с 1 с автоинкрементом, до 10, что означает меньше (10 + 1) = 11

Тогда перестановка (начало + 1, конец) называется Допустим, для первого элемента start = 1. Он будет вызываться с start как 2 и end как 10

0 голосов
/ 04 сентября 2018

Автор знаком с Python и использует ту же (неудачную) идиому в псевдокоде. В Python начало диапазона включительно , а конец эксклюзив . Позже на этой странице фрагмент кода Python доказывает, что это действительно так:

for i in range(start, end+1):

С этим кодом i будут последовательно назначаться все целые числа от start до end включительно, но исключая end + 1.

В С часто можно использовать < в циклах - тогда это также происходит там:

for (size_t i = start; start < end + 1; start++)
                               ^^^^^^^

хотя более естественным было бы написать

for (size_t i = start; start <= end; start++)
...