以下两个代码段的优点和缺点是什么:
return n==0 ? 0 : n==1 ? 1 : fib(n-1) + fib(n-2);
和
if(n==0)
return 0;
if(n==1)
return 1;
return fib(n-1) + fib(n-2);
用于计算Fibonacci序列中的第n个字母?
你会赞成哪一个?为什么?
答案 0 :(得分:7)
第一个是魔鬼,必须用火清洗。
答案 1 :(得分:6)
我赞成:
return n <= 1 ? n : fib(n-1)+fib(n-2);
答案 2 :(得分:4)
我更喜欢写作:
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else {
return fib(n-1) + fib(n-2);
}
这是非常易读的代码。我甚至不喜欢省略大括号,因为代码不可读,当你维护代码省略大括号时,你很容易犯错误。
答案 3 :(得分:2)
生活中的一切都是平衡的问题。在频谱的两个相反端之间找到正确的折衷方案。最优性是一种评分函数,它高度依赖于评估者和情况,但你应该争取一切的最佳点。
编程没有什么不同。你应该评估
找到最佳点。
你的第一个结构显然是强大而令人讨厌的,但绝对不容易理解。
答案 4 :(得分:1)
我不喜欢因为它们都太慢了。可读性不应该以运行时指数爆炸为代价,特别是当存在一种在线性时间内运行的简单方法时。
我会这样做(伪代码):
a = 0;
b = 1;
n.times { a, b = b, a + b; }
在C中你不得不使用一个临时变量,但原理是一样的。
答案 5 :(得分:1)
我比第一个更喜欢第二个,主要是为了可读性。
第二个“读取”很好 - 它的代码被破坏了,所以它读起来最像英语。这将使许多开发人员更容易理解。
就我个人而言,我发现有时难以遵循多个链式三元操作。
此外,在大多数情况下,我个人认为“简洁”是一个糟糕的目标。现代IDE使“更长”的代码比以前更易于管理。我并不是说你想要过于冗长,但根据我的经验,尝试简洁往往会导致维护工作的增加。
答案 6 :(得分:1)
如果你要求可读性,我更喜欢第二个选项,因为它不包含(double!)三元运算符。通常你正在编写其他人也必须阅读的代码,从第二个片段开始,乍一看它的功能是什么。然而,在第一个片段中,必须解决“在你脑中”的两个三元运算符,并另外考虑关联性(我会自动考虑这一点,因为缺少括号)。
但无论如何,你可以将两个if语句减少为一个:
if(n <= 1) return n;
return fib(n-1) + fib(n-2);
答案 7 :(得分:1)
在这两者中,第二部分一目了然更容易理解。但是,我将其整合为
if (n <= 1)
return n;
else
return fib(n-1) + fib(n-2);
或者,如果您没有多次退货:
if (n > 1)
n = fib(n-1) + fib(n-2);
return n;
答案 8 :(得分:1)
我经常发现缩进可以使多元三元运算符更具可读性:
return n == 0 ? 0 :
n == 1 ? 1 :
fib(n-1) + fib(n-2);
答案 9 :(得分:0)
我敢打赌,编译后的代码没有区别。 我至少试着让它更具可读性:
return n==0 ? 0 : ( n==1 ? 1 : fib(n-1) + fib(n+1) );
答案 10 :(得分:0)
在大多数情况下,我更喜欢第二种,但有时候在一行中不做它似乎有点浪费。例如,我更喜欢
text="my stuff_"+id==null ? "default" : id;
到
text="my stuff_";
if(id==null){
text+="default";
}else{
text+=id;
}
注意,这也有助于DRY,因为现在如果您需要更改text
的名称,那么您只需在一个地方更改它,而不是3.
答案 11 :(得分:0)
如果您使用?:运算符两到三次,您将习惯它,所以我会选择第一个
答案 12 :(得分:0)
我要说甚至超过@Lauri:
if (n == 0) {
tmp = 0;
}
else if (n == 1) {
tmp = 1;
}
else {
tmp = fib(n-1) + fib(n-2);
}
return tmp;
只有一个退出点是很好的。
答案 13 :(得分:0)
作为一般规则,您应该编写可读代码,这意味着实际阅读它的人最易读的代码。大多数时候,这意味着“你自己,三周后”。当你编写代码时,好的问题是“我下个月能否再次阅读并理解它?”。
除此之外,第一个表达式是错误的(它使用fib(n+1)
而不是fib(n-2)
)并且都表现出指数爆炸,这使得Fibonacci序列成为教授算法的一些重要实践方面的经典工具。