与任何特定语言无关的抽象问题:
如果我具有以下功能
min(int, int) :: int
返回数组中的最小值,
concat([int], [int]) :: [int]
结合了两个数组,我应该如何编写类似的函数
minInArray([int]) :: Int
返回数组中最小的元素,但是即使在输入数组为空的情况下,输出也可以像这样链接:
min(minInArray(array1), minInArray(array2)) == minInArray(concat(array1, array2))
换句话说,是否有任何常用的中性元素,minInArray可以在空输入时返回,而不会弄乱min()
?
答案 0 :(得分:1)
一个选择是如果数组没有元素,则返回某个中性值,例如null
或NaN
,然后运行min()
函数并且其中一个参数是中性值,则只需返回另一个数组的最小值。另一个选择是,如果数组为空,则返回语言必须与+Infinity
最接近的值。这是可行的,不需要修改min()
,但确实有副作用,有时在调用minInArray()
函数时会返回无穷大。此无限值可以用作与默认min()
函数一起使用的真正中性值,但是如果数组中的最小值确实是无限的,则可能会引起混淆。
答案 1 :(得分:1)
minInArray(arr1)如果arr1为空,则返回null。
min()应该只返回非null值,而不是null。意味着min()仅在两个参数均为null时才返回null。否则,它将返回最小非空值。
答案 2 :(得分:0)
考虑这个问题时,我们似乎已成为唯一可行的解决方案: 如果数组为空,则应返回int的最大可能值,以满足条件。
实际上不是很好...
答案 3 :(得分:0)
只是添加一些观点(不是与列出的问题重复)-
当要求它们计算空列表或数组的最小值时,所有这些都会引发某种错误:Java,Scala,Python,numpy,Javascript,C#。可能更多,但就我看来。我敢肯定有些语言不是,但是我希望大多数语言都是为了提高速度而以易懂性和清晰度为代价的语言。
This问题是关于一种特定的语言,但具有与所有语言相关的答案。
请注意here,如何用Python之类的方法解决问题。
尤其是对于Haskell,请注意此问题中的advice。
最后here's a response是您问题的更一般情况。
通常,使代码正常工作始终是最重要的,但紧随其后的是它必须是人类可以理解的。如果您将是唯一一个处理该函数的人,那么对您当前的项目可能并不重要,但是在调用“ get_minimum”函数时,我期望的最后一件事是Int.MAX。
我知道它使编码变得简单,但是我敦促您当心易于编写和理解的代码。花更多的时间使代码易于阅读,并尽可能具有立即明显的含义,以后总会节省更多时间。