递归在python中不起作用

Arj*_*rma 3 python python-2.7

我试图在python中打印一个实际上像Fibonacci的系列,但不是添加你必须繁殖.

我的代码是:

def robLan(n):
    if n > 3:
        robLan(n -1) * robLan(n - 2)

    elif n == 1:
        return 1

    elif n == 2:
        return 2

    elif n == 3:
        return 2

list = []
for i in range(1,10):
    z =  robLan(i)
    list.append(z)
print list  
Run Code Online (Sandbox Code Playgroud)

这些是我得到的错误:

File "C:\Users\Arjun's\Documents\Aptana Studio 3 Workspace\List\com\__init__.py", line 16, in <module>
    z =  robLan(i)
  File "C:\Users\Arjun's\Documents\Aptana Studio 3 Workspace\List\com\__init__.py", line 3, in robLan
    robLan(n -1) * robLan(n - 2)
TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

Mar*_*ers 5

您的函数不会返回递归调用:

if n > 3:
    robLan(n -1) * robLan(n - 2)
Run Code Online (Sandbox Code Playgroud)

如果没有return语句,则函数在没有显式返回的情况下结束,None而是返回:

>>> robLan(4) is None
True
Run Code Online (Sandbox Code Playgroud)

上面应该返回4(roblan(3) * roblan(2)给出2 * 24).对于任何5或更高的起始值,函数使用多个递归级别,并且None返回值最终用于乘法.

添加return:

if n > 3:
    return robLan(n - 1) * robLan(n - 2)
Run Code Online (Sandbox Code Playgroud)

您的陈述可以简化:

def robLan(n):
    if n > 2:
        return robLan(n - 1) * robLan(n - 2)
    return n
Run Code Online (Sandbox Code Playgroud)

然后您的示例循环生成:

[1, 2, 2, 4, 8, 32, 256, 8192, 2097152]
Run Code Online (Sandbox Code Playgroud)