2010-12-08 31 views
0

Ich versuche, eine rekursive Funktion zu schreiben, die eine ganze Zahl nehmen, n, und geben Sie alle gerade Zahl auf Null und dann jede Zahl n ...rekursive Funktion

das ist, was ich bisher haben

def kaboom(n): 
    if n>=0: 
    if n%2==0: 
      print n, 
      print kaboom(n-2), 
    else: 
      n=n-1 
      print n, 
      print kaboom(n-2), 
    print n,  
    n=n+1 
    return n 

der Ausgang

kaboom (5)

4 2 0 None 0 1 2 3 4 

5 

kaboom (4)

4 2 0 None 0 1 2 3 4 

aber es sollte

kaboom (5)

4 2 0 1 2 3 4 5 

und

sein

kaboom (4)

4 2 0 1 2 3 4 

und übrigens ist diese nicht Hausaufgaben :)

+0

Format mit der Codetaste – pastjean

+0

Keine Syntaxhervorhebung, aww. – Blender

+0

kann n negativ sein? – lijie

Antwort

8

drucken die geraden Zahlen auf dem Weg „nach unten“ durch die Rekursion und druckt jede Nummer auf dem Weg „zurück“ , jedes Mal um 1 verringert. Verwenden Sie , nach der print-Anweisung, um die Nummer mit einem Leerzeichen anstelle einer Zeilenumbruch folgen. Geben Sie keinen Wert zurück und drucken Sie keinen zurückgegebenen Wert.

def kaboom(n): 
    if (n % 2) == 0: print n, 
    if n == 0: return # we "hit bottom" 
    kaboom(n-1) # make the recursive call 
    # From this point on, we are "on the way back", and print each value. 
    print n, 
+0

thx :) karl .... – user531225

-2

Ich glaube, Sie 2 rekursiven Funktionen benötigen (in VB.Net, weil ich Python nicht kennen):

Function AllNumbers(ByVal n As Integer) As String 
    If n > 0 Then 
     Return AllNumbers(n - 1) & " " & n 
    Else 
     Return "" 
    End If 
End Function 

Function EvenNumbers(ByVal n As Integer) As String 
    If n > 0 Then 
     If n Mod 2 = 0 Then 
      Return n.ToString & " " & EvenNumbers(n - 2) 
     Else 
      Return EvenNumbers(n - 1) 
     End If 
    Else 
     Return "0" 
    End If 
End Function 

Function Kaboom(ByVal n As Integer) As String 
    Return EvenNumbers(n) & AllNumbers(n) 
End Function 
2
def kaboom(n): 
    if n >= 0: 
     if n%2 == 0: 
      print n, 
     kaboom (n-1) 
    if n > 0: 
     print n, 

Test:

>>> kaboom(4) 
4 2 0 1 2 3 4 
>>> kaboom(5) 
4 2 0 1 2 3 4 5 
1

Hier die ist itertools Weg es zu tun. Keine Rekursion:

from itertools import chain, imap 
def even_down_all_up(x): 
    return ' '.join(imap(str, chain(xrange(x-1 if x%2 else x, 0, -1), xrange(0, x+1)))) 

print even_down_all_up(5) 
4 2 0 1 2 3 4 5 

print even_down_all_up(4) 
4 2 0 1 2 3 4 

Iterator nur Version Rückkehr Strings:

from itertools import chain, imap 
def even_down_all_up(x): 
    return imap(str, chain(xrange(x-1 if x%2 else x, 0, -1), xrange(0, x+1))) 

print list(even_down_all_up(5)) 
['4', '2', '0', '1', '2', '3', '4', '5'] 

print tuple(even_down_all_up(4)) 
('4', '2', '0', '1', '2', '3', '4') 

Iterator Version Rückkehr Ints

from itertools import chain, imap 
def even_down_all_up(x): 
    return chain(xrange(x-1 if x%2 else x, 0, -1), xrange(0, x+1)) 

print tuple(even_down_all_up(4)) 
(4, 2, 0, 1, 2, 3, 4) 

HINWEIS: Ich liebe Stackoverflow für die mir Fragen itertools zu bewerben. :) EDIT: Hinzugefügt int zurückgebende Version.

+1

Hallo, komme aus den Hauptkommentaren :-) Ich denke, du stimmst zu, dass es keinen Sinn macht, eine Rekursionsversion davon zu machen. Ich hatte auch einen sehr ähnlichen Code geschrieben, nur dass ich den ersten xrange auf diese Weise hatte: xrange (n & ~ 1, -1, -2). Ich würde sagen, dass die "int-Version" wahrscheinlich genug ist, keine Notwendigkeit, Elemente zu einer Zeichenkette zuzuordnen. – tokland

+0

+1 Ich mag deine bitweise und mit der Ergänzung von einem. Das ist einfach und sauber, danke fürs Teilen. – kevpie