Python中的Fibonacci - 解释这段代码?

时间:2014-02-28 04:19:06

标签: python

我对编码很新,我一直在为Alex Bowers的初学者使用Python这本书。在每一章的最后是一个实验练习,这个特别的一个是关于Fabonacci,章节本身是关于forLoops,whileLoops,Try Except和Finally,以及Breaks and Continues。 我对解决方案感到困惑,尤其是处理变量“set”的行,任何人都可以向我解释解决方案,因为他们没有在书中解释它...谢谢

f0 = 0
f1 = 1
set = False              
while True:
    fn = f0 + f1
    f0 = f1
    f1 = fn 
    if (fn > 100):
        set = True
    else:
        set = False
    print(fn)
    if (set == True):
        break 

4 个答案:

答案 0 :(得分:5)

我假设您知道Fibonacci序列是什么(如果没有,请阅读this)。我将一次走这一步

这些是用于计算斐波纳契数列的变量。 f0是序列中的第一个数字,f1是第二个。

f0 = 0
f1 = 1

set将用作以下循环的条件,以确定何时停止。

set = False   

这是一个无限循环。

while True:

计算序列中的下一个数字。

    fn = f0 + f1

更新旧版变量。

    f0 = f1
    f1 = fn 

如果序列中的数字大于100 setTrue。否则将set设置为False(它已经是)。

    if (fn > 100):
        set = True
    else:
        set = False

打印当前序列号。

    print(fn)

如果setTrue,则保留无限循环。

    if (set == True):
        break 

注意:此代码可以轻松简化。我很惊讶它出现在书中。您可以将其简化为:

f0 = 0
f1 = 1
while True:
    fn = f0 + f1
    f0 = f1
    f1 = fn 
    print(fn)
    if (fn > 100):
        break 

答案 1 :(得分:3)

在这种情况下,

set在数字超过100时停止循环,因此它不会永远存在。这实际上是制作斐波那契序列的一种非常可怕的方式,但我会解释,因为它无论如何都是有效的代码......

f0 = 0 # initialize your
f1 = 1 # starting values
set = False              
while True:
    fn = f0 + f1 # fn is your current fib number
    f0 = f1 # advance the second-to-last number
    f1 = fn # and the last number
    if (fn > 100):
        set = True # if your current fib number is above 100, set a flag
                   # so we don't go another iteration
    else:
        set = False# otherwise, this should never ever do anything. This
                   # line of code does nothing but slow down the process
    print(fn) # print your current fib number to console
    if (set == True): # if that aforementioned flag is set...
        break         # then break out of the loop. Otherwise, loop.

对于它的价值,我会这样做:

fib = [1,1]
while True:
    num = fib[-1]+fib[-2]
    fib.append(num)
    # optionally:
    ## print(num)
    if num > 100: break

答案 2 :(得分:2)

代替使用set,代码可以用这种方式编写,以完全相同的方式实现相同的目的:

f0 = 0
f1 = 1
fn = 0
while fn <= 100:
    fn = f0 + f1
    f0 = f1
    f1 = fn 
    print(fn)

set的使用是使用适当的循环条件(fn <= 100位)的奇怪和冗长的替代方法,并且很可能只在那里使用ifhns的示例没有else条款。

您可能会在本书的其他地方遇到一些稍微更高级的逻辑,也可以删除fn变量:

f0 = 0
f1 = 1
while f0 <= 100:
    f0, f1 = f1, f0 + f1
    print(f0)

f0, f1 = f1, f0 + f1类似于:

 f0 = f1
 f1 = f0 + f1

除了在{/ 1>}或f0更改值之前 之前评估右侧表达式。

希望看到以这种简化形式编写的内容可以帮助您准确理解发生了什么。

答案 3 :(得分:1)

对于您对此论坛的介绍感到抱歉。它通常是一个非常好的资源,但有时精英主义接管。

我认为您的问题尚未真正得到解答。

set = False # assigning a value to a name of a thing the thing is set and the value is False
while True:  # this means the loop will continue until it hits a return statement

事实上,set不必在循环之外初始化循环,循环将继续,直到循环内满足某些条件将导致返回。在这种情况下,条件是名为set的对象的值已更改为True。我不是一个程序员,但这是非常可怕的代码。

让我补充说,另一个问题是set是特殊类型对象的保留字,因此会在代码中添加另一个黑色标记。当我在IDLE中键入代码时,单词集是紫色的 - 这是一个你正在进入危险区域的信号 - 使用对象名称或保留字作为变量的名称