递归函数

时间:2010-12-08 16:07:19

标签: python recursion

我正在尝试编写一个递归函数,它接受一个整数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

5

但应该是

KABOOM(5)

4 2 0 1 2 3 4 5

KABOOM(4)

4 2 0 1 2 3 4

顺便说一下这不是作业:)

4 个答案:

答案 0 :(得分: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,

答案 1 :(得分: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

答案 2 :(得分: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

仅迭代器版本返回字符串:

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版本返回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)

注意:我喜欢stackoverflow给我一些问题来应用itertools。 :) 编辑:添加了int返回版本。

答案 3 :(得分:-2)

我认为你需要2个递归函数(在VB.Net中,因为我不知道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