2010-12-08 9 views
0

Je suis en train d'écrire une fonction récursive qui prend un entier, n, et donner tout le même nombre à zéro et chaque numéro à n ...fonction récursive

c'est ce que j'ai à ce jour

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 

la sortie est

kaboom (5)

4 2 0 None 0 1 2 3 4 

5 

kaboom (4)

4 2 0 None 0 1 2 3 4 

mais il devrait être

kaboom (5)

4 2 0 1 2 3 4 5 

et

Kaboom (4)

4 2 0 1 2 3 4 

et par la façon dont ce n'est pas devoirs :)

+0

format avec le bouton de code – pastjean

+0

Pas de coloration syntaxique, aww. – Blender

+0

peut être négatif? – lijie

Répondre

8

Imprimer les nombres pairs sur le chemin « vers le bas » par la récursivité et imprimer chaque numéro sur le chemin « retour » , réduisant de 1 à chaque fois. Utilisez , après l'instruction d'impression pour suivre le nombre avec un espace au lieu d'un saut de ligne. Ne renvoyez pas de valeur et n'imprimez pas une valeur renvoyée.

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

Je pense que vous avez besoin de 2 fonctions récursives (en VB.Net parce que je ne sais pas python):

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

Voici la Itertools façon de le faire. Pas de récursion:

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 seule version cordes retour:

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') 

version Iterator ints retour

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) 

NOTE: J'aime stackoverflow pour me donner des questions à itertools appliquer. :) EDIT: Ajout de la version int retournée.

+1

Salut, venant des commentaires principaux :-) Je suppose que vous êtes d'accord qu'il n'y a aucun intérêt à faire une version récursive de cela. J'avais aussi écrit un code très similaire, seulement que j'avais le premier xrange de cette façon: xrange (n & ~ 1, -1, -2). Je dirais que la "version int" est probablement assez, pas besoin de mapper les éléments à la chaîne. – tokland

+0

+1 J'aime vraiment votre bitwise et avec le complément d'un. C'est simple et propre, merci pour le partage. – kevpie