【问题标题】:How to return a list on the end of a recursive function in Python如何在 Python 中的递归函数末尾返回一个列表
【发布时间】:2014-03-27 04:29:27
【问题描述】:

我正在使用 Python 中的斐波那契数列(我知道使用 yield 的实现,但想使用递归来实现)并最终得到以下代码 sn-p:

def fib(start, leng):
    """ Recursive Fibbo"""
    # Should be lists
    if type(start) == int:
        start = [start]

    # Escape route
    if len(start) == leng:
        print start
        return start

    # Run
    else:
        if int(start[-1]) == 0:
            start.append(1)
        else:
            if len(start) == 1:
                start.append(start[-1])

        next_number = int(start[-1]) + int(start[-2])
        start.append(next_number)
        fib(start, leng)

现在,它是这样工作的:

>>> a = fib(0, 10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> type(a)
<type 'NoneType'>
>>> 

它计算序列,最后打印出来……但是…… 我怎么能把它也返回列表?

是否可以不使用任何其他辅助函数或使用 yield 而不是任何外部库?

如果不是,为什么? (如果是,如何)?

谢谢! :)

【问题讨论】:

  • 你知道,递归只是意味着一个函数调用自己。您仍然可以递归地实现它并使用yield。然后,您将获得所有美妙的好处并且您只需调用list(fib(a, b)) 即可轻松创建list。 ;)
  • 还有建议的修复,您的代码仍然存在一些逻辑问题:例如fib(6,10) 显示 [6, 6, 12, 18, 30, 48, 78, 126, 204, 330]。这是期望的行为吗?
  • @Two-BitAlchemist 请向我们展示您的递归生成器(在 python2.x 中作为 OP 的代码)。
  • 好吧,这是一个紧张的玩笑。我试图提倡使用yield,并建议这更多是你为了好玩而做的事情,看看你是否可以,而不是使用。 :P
  • 哦,我不了解 Python 2.x 生成器。 yield 记录在 Python 2.2 中,并带有 __future__ 导入。

标签: python recursion fibonacci


【解决方案1】:

把最后一行改成

 return fib(start,  leng)

这将沿着递归线进行“下一点”工作,并返回基于前面在代码中定义的基本情况的最终产品作为逃生路线:

# Escape route
if len(start) == leng:
    print start
    return start

一旦您在逃生路线中点击返回,返回就会传播回调用堆栈,每次调用 return fib(start, leng) 都会返回完整的答案。一旦调用堆栈返回到您对函数的原始调用(在其他地方进行),该函数实际上完成并返回您的预期值。

【讨论】:

    【解决方案2】:

    你的最后一行也需要是return:

    return fib(start, leng)
    

    否则,您从“逃生路线”返回的值不会传播回来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2015-11-09
      • 2011-02-04
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多