fibonacci在python中工作但在Java中失败

eag*_*arn 20 python java fibonacci

我有这个用于计算fibonacci数字的代码python.它起作用并给出预期的结果.但是当我翻译相同时Java,它失败了.知道这里出了什么问题吗?

python:

def fib3(n): 
  a,b=0,1
  while n>0:
      a,b=b,a+b
      n-=1
  return a
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

fib2(12) --> 2048

mhl*_*ter 26

在这个部分:

a=b;
b=a+b;
Run Code Online (Sandbox Code Playgroud)

你要分配ba+b,但a已经分配给了b.真的,你加倍了b

最简单的解决方案是临时变量:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

打破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)
Run Code Online (Sandbox Code Playgroud)

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

temp_tuple = (b, a + b)
a, b = temp_tuple
Run Code Online (Sandbox Code Playgroud)

  • 呸!你打了我13秒 (2认同)

Don*_*ows 9

问题是,你有一个从价值ba 同时作为分配给b的总和ab.得到同时交换错误,你得到了错误的答案.

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

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

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


好吧,如果它确实让你遇到了鼻子恶魔的问题,我建议你以后不要使用那个编译器.但是你无法保证获得正确的fib()函数......

  • 它有效,但这是*可恶*.+1 (5认同)
  • 为了记录,如果我在代码中看到任何类似于我所维护的技巧,我会将其重构为更简单(如果更详细)的语句.过度的诡计总是重构的一个很好的理由! (4认同)
  • [远处尖叫] (3认同)

ins*_*get 6

a = b;
b = a+b;
Run Code Online (Sandbox Code Playgroud)

这会计算,b = 2*b因为a计算新值时会覆盖其值b.替换为:

t = b;
b = a+b;
a = t
Run Code Online (Sandbox Code Playgroud)


Wol*_*olf 5

a=b;
b=a+b;
Run Code Online (Sandbox Code Playgroud)

......是问题所在.您需要a在添加之前保存旧值b.


Ell*_*sch 5

代码不等同,依赖于python在一行中分配多个原语的能力a,b=b,a+b; 你需要一个临时变量 -

public static int fib2(int n){
  int a = 0;
  int b =1;
  while(n-- >0){
      int t = b; // <-- to hold the original value of b.
      b = a + b;
      a = t;
  }
  return a;
}
Run Code Online (Sandbox Code Playgroud)