大多数编程语言都会给出2
平方根的答案4
。但是,有两个答案:2
和-2
。是否有任何特殊原因,历史原因或其他原因,为什么通常只给出一个答案?
12 回答
因为:
- 在数学中,除非另有说明,否则 √<i>x 通常指的是x [ http://mathworld.wolfram.com/SquareRoot.html]的主(即正)根。
- 某些语言无法返回多个值。
- 由于您可以只应用否定,因此返回两者将是多余的。
如果平方根方法返回两个值,那么这两个值中的一个实际上总是会被丢弃。除了在额外的返回值上浪费内存和复杂性之外,它几乎不会被使用。每个人都知道您可以将返回的答案乘以-1
并获得另一个根。
我希望只有数学语言会在这里返回多个值,可能是数组或矩阵。但是对于大多数通用编程语言,按照您的建议进行操作的收益和成本都可以忽略不计。
一些想法:
从历史上看,函数被定义为返回单个值的过程。
定义一个像这样返回多个值的干净函数会很繁琐(使用原始编程结构) 。
规则总是有例外:
- 例如 0 只有一个根(0)。
- 您不能取负数的平方根(除非语言支持复数)。在不支持虚数或复数系统的语言中,这可以被视为异常(如“除以 0”)。
推导出2 个平方根通常很简单(只需否定函数返回的值)。如果他们的域依赖于处理正 (+) 和负 (-) 根,这可能是 sqrt() 函数的调用者的练习。
返回一个数字比返回两个数字更容易。大多数工程决策都是以这种方式做出的。
有许多函数只能从 2 个或更多可能性中返回 1 个答案。例如反正切。1 的反正切返回为 45 度,但也可以是 225 甚至 405。与生活和编程中的许多事情一样,我们知道并且可以依赖一个约定。平方根函数返回正值就是其中之一。我们,程序员,要记住还有其他解决方案,并在代码中需要时对它们采取行动。
顺便说一句,在处理运动学和逆运动学方程时,这是机器人技术中的一个常见问题,其中存在对应于笛卡尔位置的链接位置的多个解。
在数学中,按照惯例,除非您明确说明,否则始终假定您想要某事物的正平方根。四的平方根实际上是二。如果你想要否定的答案,在前面放一个否定的符号。如果你想要两者,请加上加号或减号。如果没有这个约定,就不可能写出方程式;即使他们确实在前面放了一个符号,您也永远不会知道他们的意图(例如,因为它可能是负平方根的负数)。此外,如果运算符开始返回两个值,您将如何编写任何涉及数学的计算机代码?它会破坏一切。
这个约定的不幸例外是在求解变量时。在以下等式中:
x^2 = 4
你别无选择,只能考虑 X 的两个可能值。如果你取两边的平方根,你会得到 x = 2 但现在你必须输入加号或减号以确保你没有错过任何可能的解决方案. 另外,请记住,在这种情况下,从技术上讲,X 可以是正数或负数,而不是四的平方根。
因为多个返回类型实现起来很烦人。如果您真的需要另一个结果,那么将结果乘以 -1 是不是很容易?
因为大多数程序员只想要一个答案。
如果调用者需要,很容易从正值生成负值。对于大多数代码,调用者只使用正值。
但是,现在很容易以多种语言返回两个值。在 JavaScript 中:
var sqrts=function(x) {
var s=Math.sqrt(x);
if (s>0) {
return [s,-s];
} else {
return [0];
}
}
只要调用者知道遍历返回的数组,你就是黄金。
>sqrts(2)
[1.4142135623730951, -1.4142135623730951]
我认为因为该函数被称为“sqrt”,如果你想要多个根,你将不得不调用函数“sqrts”,它不存在,所以你不能这样做。
更严肃的答案是您提出了一个更大问题的特定实例。许多方程和通常的反函数(包括 sqrt)有多种可能的解,例如 arcsin 等,而这些通常是一个问题。例如,对于 arcsin,是否应该返回无限数量的答案?例如,参见有关分支削减的讨论。
因为它在历史上被定义为{{引用需要}}作为给出已知表面正方形边长的函数。在这种情况下,长度是积极的。
你总是可以知道另一个数字是什么,所以也许没有必要同时返回它们。