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 6849 Точки
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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.