2010-12-08 37 views
0

私は整数を取る再帰関数を記述しようとし、nおよびnに、その後のすべての数をゼロに、すべての偶数を与えるとしています...再帰関数

これは私がこれまで持っているものです

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 

出力

KABOOM(5)

4 2 0 None 0 1 2 3 4 

5 

KABOOM(4)

4 2 0 None 0 1 2 3 4 

それは

KABOOMであるべきである(5)

4 2 0 1 2 3 4 5 

KABOOM(4)

4 2 0 1 2 3 4 

及び方法によって、これは宿題:)

+0

(コードボタン付き) – pastjean

+0

構文強調表示はありません。 – Blender

+0

は負になりますか? – lijie

答えて

8

プリント方法再帰介して「ダウン」で偶数ではなく、方法「戻る」の各番号を印刷毎回1ずつ減少します。 print文の後ろに,を使用して、改行ではなくスペースで数字を続けます。値を返さず、戻り値を出力しないでください。

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

私は(私のpythonを知らないので、VB.Netで)あなたは2つの再帰関数が必要だと思う:

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, 

テスト:

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

はこちらそれを行う方法itertools。 ない再帰:文字列を返す

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 

イテレータ唯一のバージョン:int型

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を返す

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

イテレータ版:私はにitertoolsを適用するために私に質問を与えるためStackOverflowのが大好きです。 :) EDIT:バージョンを返すintが追加されました。

+1

こんにちは、メインのコメントから来て:-)私はあなたがこれの再帰バージョンを行うことには何のポイントもないと思います。私も非常に似たようなコードを書いていましたが、最初のxrangeはxrange(n&〜1、-1、-2)しかありませんでした。私は "intバージョン"はおそらく、要素を文字列にマップする必要がないと言うでしょう。 – tokland

+0

+1私は本当にあなたのbitwiseと1の補完が好きです。それはシンプルで清潔で、共有するためのものです。 – kevpie