def algae(S, n):
    """
    Print S rewritten with the algae rule to recursion depth n
    """
    al = {'A': 'AB', 'B': 'A'}
    # Base case
    if n == 0:
        return S
    # Transform each symbol in S
    for symbol in S:
        S += algae(al[symbol], n - 1)

print(algae('A', 5))

Cześć, czy każdy może wyjaśnić, dlaczego podczas drukowania wyniku tej funkcji otrzymuję błąd:

TypeError: Can't convert 'NoneType' object to str implicitly

Odnosi się do linii 11 (S + = Algae (Al [Symbol], N - 1))

0
Michael Howlard 9 grudzień 2013, 22:54

5 odpowiedzi

Najlepsza odpowiedź

Edytuj:

Jest to wersja robocza twojego skryptu:

def algae(S, n):
    """
    Print S rewritten with the algae rule to recursion depth n
    """
    al = {'A': 'AB', 'B': 'A'}
    if n == 0:
        return S
    # Make a new string to build on
    mystr = ""
    for symbol in S:
        # Add the translation to the new string
        mystr += al[symbol]
    # Recursively call the function, passing in the string
    return algae(mystr, n-1)

print(algae('A', 5))

Wynik:

ABAABABAABAAB

Uwaga: Jeśli chcesz, możesz to zrobić o wiele bardziej wydajne jak @blckknght powiedział:

def algae(S, n):
    """
    Print S rewritten with the algae rule to recursion depth n
    """
    al = {'A': 'AB', 'B': 'A'}
    if n == 0:
        return S
    mystr = "".join(al[c] for c in S)
    return algae(mystr, n-1)

print(algae('A', 5))
3
9 grudzień 2013, 19:32

Kiedy n != 0 Twój kod spada z końca funkcji. W Pythonie, to jest odpowiednik powrotu None. Musisz dodać oświadczenie {x2}} dla sprawy rekurencyjnej.

3
Fred Foo 9 grudzień 2013, 18:56

W przypadku, w którym n nie jest 0, algae nigdy nie return s cokolwiek, więc python niejawnie daje mu wartość zwracana None. Następnie algae wywołaj, a następnie próbuje zrobić S += None z tego powodu, co wytwarza błąd. Dodaj return S do końca funkcji, aby to naprawić.

0
jwodder 9 grudzień 2013, 18:57

Brakuje "powrotu S" na końcu Twojej funkcji.

0
smeso 9 grudzień 2013, 18:59

Wersja robocza bez rekurencji (nigdy nie lubił rekursion)

    def algae(S, n):
    al = {'A': 'AB', 'B': 'A'}
    for i in range(n):
        newS = ''
        for i in range(len(S)):
            newS += al[S[i]]
        S = newS
    return S

print(algae('A', 5))
0
M4rtini 9 grudzień 2013, 19:21