斐波那契在python中工作,但在Java中失败

2022-09-02 05:21:12

我有这个代码用于计算数字。它有效并提供预期的结果。但是当我翻译成相同的,它失败了。任何想法,这里出了什么问题?fibonaccipythonJava

在:python

def fib3(n): 
  a,b=0,1
  while n>0:
      a,b=b,a+b
      n-=1
  return a

fib3(12) --> 144

在:Java

 public static int fib2(int n){
        int a = 0;
        int b =1;
        while(n-- >0){
            a=b;
            b=a+b;

        }
    return a;
}

fib2(12) --> 2048


答案 1

本节内容:

a=b;
b=a+b;

您正在分配给 ,但已经是 。所以真的你翻了一番ba+babb

最简单的解决方案是温度变量:

public static int fib2(int n){
    int a = 0;
    int b =1;
    while(n-- >0){
        int old_a;
        old_a = a;
        a=b;
        b=old_a+b;
    }
    return a;
}

在python中,在将新值分配给变量之前自动存储中间体,而在Java中,您需要明确说明它a, b = b, a + btuple

分解Python的指令,正在执行这个反汇编:a, b = b, a + b

  5          17 LOAD_FAST                1 (b)
             20 LOAD_FAST                0 (a)
             23 LOAD_FAST                1 (b)
             26 BINARY_ADD
             27 ROT_TWO
             28 STORE_FAST               0 (a)
             31 STORE_FAST               1 (b)

从更简单的意义上说,保持python,这是过程:

temp_tuple = (b, a + b)
a, b = temp_tuple

答案 2

问题是,在分配到 和 的总和的同时,您必须从 到 一个值。弄错同时交换,你得到错误的答案。babab

本着Python代码的精神,我提出:

public static int fib(int n) {
    int a = 0, b = 1;
    while (n-->0)
        b = a + (a = b);
    return a;
}

这与添加同时有效地进行交换(严格来说不是,但它已经足够好了)。请注意,这是定义良好的Java,因为该语言精确地定义了运算符的求值顺序,这与C和C++不同(其中上述代码的等效物由于未定义的行为而允许恶魔从你的鼻子里飞出来)。


好吧,如果它确实让你遇到鼻涕虫的问题,我建议将来不要使用那个编译器。但是你不能保证得到一个正确的fib()函数...