【问题标题】:Logic on printing Fibonacci numbers in Python在 Python 中打印斐波那契数的逻辑
【发布时间】:2018-01-30 08:34:51
【问题描述】:

这让我很生气。当使用以下代码打印 Fib 编号时,它会给出正确的输出:

a = 0
n = 1
while n < 55:
    print(n)
    a,n = n,a+n

但是当我改成这个时:

a = 0
n = 1
while n < 55:
    print(n)
    a = n
    n = a+n

输出完全不同。 我什至通过 pythontutor.com 运行它来观看步进。

我错过了什么。

【问题讨论】:

    标签: python fibonacci


    【解决方案1】:

    两个代码sn-ps之间变量值的解释和分配方式有所不同。

    在第一个sn-p的情况下,在将值分配给“n”时,不使用a的新值,而是使用前一次迭代中a的值。

    但是,在第二个 sn-p 的情况下,“a”的值首先被更新,然后用于第二个语句。

    举个例子:

    对于第一次迭代,其中 n 为 1,

    第一个代码片段:在迭代结束时,a 的值为 1,n 的值也为 1。(对于 n = a+n,考虑 a 的值0)

    第二段代码:在迭代结束时,a 的值为 1,n 的值为 2。(对于 n = a+n,a 的值被认为是 1 )

    关于 Python 逗号运算符需要注意的关键点是,赋值运算符右侧的所有表达式在实际进行赋值之前都会先求值,这会导致两者的输出不同。

    【讨论】:

      【解决方案2】:

      嗯,最初的分配

       a,n = n,a+n
      

      意思

       old_a = a
       a = n
       n = old_a + n # saved a value (old_a) used 
      

      请注意n = old_a + n,而不是a + n == 2 * n

      【讨论】:

        【解决方案3】:

        让我们在第 i 次迭代时调用 a_i 和 n_i 的值 a 和 n。 在第一个代码中,您将值a_i + n_i 分配给n_i+1,而不是在第二个代码中,您将值n_i+1 分配给a_i+n_i+n_i。 发生这种情况是因为您在第二个代码中在 n 之前分配了 a,而这同时发生在第一个代码中。要解决此问题,请将 n 或 a 的旧值保存在临时变量中。

        或者,只需一点数学,您就可以在不保存任何临时变量的情况下执行以下操作:

        a = 0
        n = 1
        while n < 55:
            print(n)
            n = a+n
            a = n-a
        

        相当于:a_i+1 = n_i+1 - a_i = a_i + n_i - a_i = n_i。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-21
          • 2015-01-04
          • 2012-02-15
          • 2013-04-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多