Значение постоянно меняется с рекурсией - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующий код:

def perm(s, length, i=0, best=0):
    original='MTR'
    s=list(s)
    if i==length: 
        print(s)
        for k in range(0,len(s)):
            score=0
            if s[k]==original[k]:
                if s[k]=='M':
                    score+=3
                elif s[k]=='T':
                    score+=2

            if s[k]!=original[k]:
                score-=3

            if score>best:
                best=score

    else: 
        for j in range(i,length):
            s[i], s[j] = s[j], s[i] 
            perm(s, length, i+1, best) 
            s[i], s[j] = s[j], s[i]

    return best

print(perm('MTB', len('MTB')))

Код должен находить различные расположения входной строки и затем выводить лучший результат в зависимости от того, насколько хорошо расположение соответствует исходной строке.

В этом случае предполагается, что значение 'best' должно выводить 5 в самом конце кода, но сейчас его вывод неверен, потому что рекурсия сбрасывает свое значение. Может ли кто-нибудь помочь мне решить эту проблему?

Я новичок в python, поэтому, пожалуйста, извините за плохой синтаксис!

(я понимаю, что logi c этого кода не делает смысл!)

1 Ответ

0 голосов
/ 28 января 2020

Использование функции из itertools в Python stdlib может помочь избежать сложности рекурсии в этом случае:

import itertools
def newperm(s, length):
    original='MTR'
    best = 0
    for combination in itertools.combinations_with_replacement(s,len(s)):
        score=0
        for i in range(len(s)):
            if combination[i] == original[i]:
                if  combination[i]== 'M':
                    score += 3
                elif combination[i] == 'T':
                    score += 2
        if score > best:
            best = score
    return best
newperm('MTB',3)

Вот версия функции, которая принимает переменную «original»:

import itertools

def newperm(s, length, original='MTR'):
    best = 0
    for combination in itertools.combinations_with_replacement(s,len(s)):
        score=0
        for i in range(len(s)):
            if combination[i] == original[i]:
                if  combination[i]== 'M':
                    score += 3
                elif combination[i] == 'T':
                    score += 2
        if score > best:
            best = score
    return best
newperm('MTB',3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...