2017-07-11 4 views
-1

Ich kann kein Pascal-Dreieck machen. Ich muss anhängen, um Elemente in der Rekursion aufzulisten, aber das Ergebnis meiner Arbeit ist Liste, die an Liste anfügt. Kannst du mir helfen, es zu tun? Mein Testcode lautet:Liste anhängen in Rekursion

def list(row): 
    if(row is 0): 
     return 0 
    return [row, list(row-1)] 

Wenn ich es verwenden, ich Liste in der Liste angezeigt werden können. Ich brauche Elemente in der Liste

print(list(10)) 

Ausgang:

[10, [9, [8, [7, [6, [5, [4, [3, [2, [1, 0]]]]]]]]]] 

Erwartete Ausgabe:

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
+0

Rekursion verwendet werden soll. –

+1

'Liste' ist ein reserviertes Wort in Python, verwenden Sie einen anderen Namen für Ihre Funktion – depperm

+0

Können Sie bitte eine Eingabe und eine erwartete Ausgabe bereitstellen? – Szabolcs

Antwort

3

In Bezug auf Ihre spezifische Funktion, hier einen Weg, Sie es schreiben könnte

def foo (row): 
    if row == 0: 
    return [0] 
    else: 
    return [row] + foo (row - 1) 

print(foo(10)) 
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

Vielleicht eine „pythonic“ Art und Weise des Schreibens, das

print([10 - x for x in range (0, 11)]) 
# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

In Bezug auf Pascals Dreieck Sie, hier ist ein Weg sein würde kann das Programm mit einem Hilfshelfer und Fortsetzungsübergabe-Stil schreiben - für diejenigen, die sich wundern, wurde diese Wahl getroffen, so dass das Ergebnis in einer einfachen Art und Weise zusammengesetzt werden konnte und der rekursive Aufruf ist in Schwanz Position, leicht auf einem Trampolin Stapel sicher, wenn nötig

def sliding (n,xs): 
    if n > len(xs): 
    return [] 
    else: 
    return [xs[0:n]] + sliding(n, xs[1:]) 

def pascal (n): 
    def aux (m, prev, k): 
    if n == m: 
     return k([prev]) 
    else: 
     return aux(m + 1, [1] + [x + y for (x,y) in sliding(2, prev)] + [1], lambda rest: k([prev] + rest)) 
    return aux(1, [1], lambda x: x) 

for line in pascal(5): 
    print(line) 
# [1] 
# [1, 1] 
# [1, 2, 1] 
# [1, 3, 3, 1] 
# [1, 4, 6, 4, 1] 
1

Es klingt wie Sie die Liste [x] mit der Liste zurück, um als Ergebnis des Aufrufs verketten möchten list(x-1). Das Schöne an Listen in Python ist, dass der Operator + genau das tut. Wenn wir die finale Return-Anweisung zu return [x] + list(x-1) ändern, gehen wir in die richtige Richtung. Sie werden dann feststellen, dass Sie Probleme haben, wenn x 0 ist, da Sie keine Liste zu einer Ganzzahl hinzufügen können. Daher sollten Sie Ihren Basisfall in return [0] ändern. Schließlich wird, wie bereits erwähnt, ist es am besten erklären Namen zu vermeiden, die Python eingebaute Funktionen überschreiben (list eine ist), also lassen Sie uns Ihre Funktion my_list umbenennen:

def my_list(row): 
    if row == 0: 
     return [0] 
    return [row] + my_list(row-1) 

Diese nicht ganz Sie Dreieck pascal, aber Hoffentlich bist du auf dem richtigen Weg.

+0

Danke. Diese Antwort ist auch sehr hilfreich –

1

Was Sie wollen, ist dies wahrscheinlich:

return [row] + list(row-1) 

Dies erzeugt eine Liste mit einem Element row und fügt die andere Liste oben drauf.

1

Sie eine Funktion rekursive Bereich erstellen zu setzen könnte diese Funktion Sinn gemacht, die Ihre erwarteten Ergebnisse gibt:

def rec_range(n): 
    return [n] + rec_range(n-1) if n else [0] 
>>> rec_range(10) 
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 

es Hoffnung hilft.

Oder verwenden Sie einfach range (xrange in Python2.x):

>>> list(range(10+1))[::-1] # reverse the list 
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
+0

Vielen Dank. Sehr hilfreich –

+0

@NurislomTuraev du bist willkommen! – Szabolcs

0

Sie können eine Pascals Dreieck mit der gegebenen Art und Weise erstellen

def pascal(rows): 
    for i in range (rows): 
    value=1 
    List = [value] 
    for j in range (i): 
     value = value * (i-j) * 1/(j + 1) 
     List.append(int(value)) 
    print(List) 

pascal(5) 
# [1] 
# [1, 1] 
# [1, 2, 1] 
# [1, 3, 3, 1] 
# [1, 4, 6, 4, 1] 
+0

Rekursion sollte verwendet werden. Es ist eine Aufgabe. –