阅读这个斐波那契函数

时间:2014-12-11 20:53:35

标签: python function

我试图阅读以下代码,但我有一段艰难时期:

def fib2(n): # return Fibonacci series up to n
    "Return a list containing the Fibonacci series up to n"
    result = []
    a, b = 0, 1

    while b < n:
        result.append(b)    # see below
        a, b = b, a+b

    return result

f100 = fib2(100)    # call it
f100                # write the result
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

我们从:

开始
def fib2(n) 

据我了解,我们只是创建定义,其中n将是要指定的参数。然后我们进入:

result = [] 

这对我来说似乎是要将输出发布到空列表中。从那里我们进入:

a, b = 0, 1 

我有点难以理解为什么我们指定&#34; a = 0&#34;和&#34; b = 1&#34;?是否只是指定一个初始值,其值并不重要?例如,我可以指定:

a, b = 2,3 

此时只是简单地开始这个系列?如果我们再查看这部分代码:

while b < n: 
    result.append(b) 
    a, b = b, a+b
return result

我假设这样看起来只是满足功能的目标,给我们系列直到B不小于n,同时附加到空列表。返回结果是否只是为了给我们打印输出?对不起,我知道这是基本的,但我有一些难以理解的功能,所以我想我会选择一个非常基本的例子。

3 个答案:

答案 0 :(得分:2)

def fib2(n)
你是对的,它只是定义了一个名为function的{​​{1}},它以fib2为参数。

n
result = []将为result

type list
对于Fibonacci序列,重要的是要理解序列将a, b = 0, 1n-1添加到其即将创建的值,即n-2的创建方式。

这样看:
1 1 2 3 5 8...
0 1 1 2 3 5 8...其中a为0且b为1,因此a b....是序列的开头

b

Python是一种很棒的语言,但它可能令人困惑 while b < n: result.append(b) a, b = b, a+b return result 让我们来研究一下。 Python允许分配变量,以便您可以在不影响初始值的情况下分配变量。

也就是说,如果a, b = b, a+b为0且a为1,那么b将如下所示:

a, b = b, a+b将成为a,但会将其存储为临时值1.重要的是要知道在完成此行代码之前,a实际上并未分配b
b将成为ba+b并将其存储为新值。

现在,如果0+1为2且b为1,让我们看看会发生什么:
a

a, b = b, a+b将成为a但不会在代码行之后,因此b将变为a
2将成为b,或者在此情况下为a+b。如您所见,首先重新分配1+2实际上并未更改此表达式中a的值。很简约!

考虑这一单行分配的更简单方法是这样的:
a

a, b = b, a+b

是的,a1 = b b1 = a+b a = a1 b = b1 是检查满足while b < n循环的条件。 while不再小于b后,循环将停止并返回n

答案 1 :(得分:1)

以下问题的答案:

"result = []

这对我来说似乎是要将输出发布到空字典中。

是的,这是初始化输出变量,它是list,而不是字典。

"a, b = 0, 1 

我有点难以理解为什么我们指定“a = 0”和“b = 1”?是否只是指定一个初始值,其值并不重要?例如,我可以指定:

a, b = 2,3 

并且此时只是启动系列?

是的。 0和1用于初始化您的斐波那契变量。请注意,0不属于该系列,但使用的是因为它是系列中前两个数字之间的差异。它永远不会附加到输出中。你是对的,你可以使用2和3来初始化系列,这将在3开始系列。所以这些价值观确实很重要。

如果我们再查看这部分代码:

while b < n: 
result.append(b) 
a, b = b, a+b
return result

我假设这个看起来只是满足函数的目标,给我们系列直到B不小于n,同时附加空字典。返回结果是否只是为了给我们打印输出?

我认为这里的中间两个语句应该用不同数量的空格缩进,以使程序正常工作。缩进是python识别代码块的方式。你在这里复制代码时错过了吗?

一旦这样做,你就是正确的,循环可以增加斐波那契变量,直到超过输入参数。 return语句不是“打印输出”,而是将输出列表返回给调用代码;它被分配给变量f100

如果您有更多问题,请告诉我们;和你自己一起思考的好工作!

答案 2 :(得分:0)

该函数返回Fibonacci序列中小于n的数字列表。

正如您正确指出的,

ab分别初始化为01,因为它们是序列中的前两个数字。这些值执行很重要,因为根据定义它们是序列的前两个数字。

从技术上讲,使用23 确实仍会产生与Fibonacci序列相同的模式,但它将从2开始而不是0.因此得到的序列将是是{2, 3, 5, 8, 13, [...]}。也就是说, Fibonacci sequence以1或0开始(同样,按定义),因此,以2开头的序列只是一个“公正的”Fibonacci序列。

23碰巧是唯一(其他)两个数字(大于或小于1的数字*),这也适用于此。例如,如果您使用3和4,则序列将为{3, 4, 7, 11, [...]},这显然不是Fibonacci序列,它只采用相同的模式。

您返回列表的原因取决于代码尝试解决的问题。如果要打印包含小于n的数字的Fibonacci序列列表,您的函数将帮助您完成此操作。如何使用fib2(n)函数返回的列表取决于代码的应用程序。

*请注意,您也可以使用2个已知的斐波那契数字开始系列,并像以前一样获得部分系列。例如,

a,b = (3,5)

因此,得到的序列将是{3, 5, 8, 13, 21, [...]},这是另一个部分斐波那契序列。