Професионална програма
Loading...
+ Нов въпрос
asata avatar asata 8 Точки

Python алгоритъм проблем

Здравейте, 

Имам следния проблем, опитвам се да пренапиша от C# na Python този алгоритъм:

void VarNoRep(int index) {

    if (index >= k)

        Print(arr);

    else

        for (int i = index; i < n; i++) {

        arr[index] = free[i]; Swap(ref free[i], ref free[index]);

        VarNoRep(index + 1);

        Swap(ref free[i], ref free[index]);

} }

int k = 3;

int n = 4; int[]

arr = new int[k];

int[] free = new int[n]

{ 1, 2, 3, 4 }; VarNoRep(0);

 

 

from array import array


k = 3
n = 5
arr = array('i', (0 for i in range(0, k)))
free = array('i', [1, 2, 3, 4, 5])


def variation_no_rep(index):
    if index >= k:
        print(', '.join(str(x) for x in arr))
        return
    else:
        for i in range(index, n):
            arr[index] = free[i]
            swap(free, free[i], free[index])
            variation_no_rep(index + 1)
            swap(free, free[i], free[index])


def swap(self, i, j):
    self[i], self[j] = self[j], self[i]


variation_no_rep(0)

 

Много се закучи работата 

0
Общи приказки 03/08/2016 01:26:29
RoYaL avatar RoYaL Trainer 6845 Точки
Best Answer

Сигурен ли си, че знаеш какво искаш да направиш? Т.е. разбираш същността на алгоритъма, който искаш да пренапишеш на Python?

Аз до колкото разбирам в C#-ския код, на функцията Swap (която не си я показал) се подават две променливи, които се swap-ват по референция.

Ако си го представим така:

free = {1, 8, 12, 4}

и искаме да swap-нем 8 и 4, на функцията подаваме

Swap(ref free[1], ref free[3]);

Което означава, че swap-ваме елементите на index=1 и index=3. Функцията обаче получава числата 8 и 4, и въобще не и пука за масива. Тя swap-ва референцията към която сочи 8 в паметта, с тази на 4.

В твоята имплементация, тъй като не ги подаваш по референция (и слава Богу, че референтното подаване в C# е the evilest thing I've ever seen) не трябва да подаваш самите числа, а само индексите.

Това което правиш е Swap(free, free[1], free[3])

Какво получава функцията?

    1. Масивът free

    2. Числото 8

    3. Числото 4

Какво прави функцията?

free[8], free[4] = free[4], free[8]

И такива индекси във "free" няма. По-скоро това, което искаш да направиш е Swap(free, 1, 3).

Също мисля, че array import-а ти е излишен. Подобна функционалност можеш да постигнеш и със стандартните списъчни структури:

arr = [0] * k
free = [1, 2, 3, 4, 5]

 

Успех!

1
asata avatar asata 8 Точки

Евала, признах те!

0