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)
你要分配b给a+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)
问题是,你有一个从价值b到a 同时作为分配给b的总和a和b.得到同时交换错误,你得到了错误的答案.
本着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()函数......
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)
代码不等同,依赖于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)
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |