我有一个整数除以5的数学函数
intDivByFive(N)= N / 5
有人告诉我要递归定义它。
有人可以解释我在这里被要求做的到底是什么吗?
答案 0 :(得分:2)
我假设您要递归计算N/5
,而无需使用/
运算符。 (这是不必要且不切实际的,但在这种情况下我们可以忽略它。)
(请注意,在此答案的其余部分中,我将N
重命名为D
以与JLS中使用的术语保持一致。)
对于除法d / n
的{{3}}定义,我们需要找到q
和r
,使d = q * n + r
在0 ≤ r < |n|
处。
因此,对于d / 5
,q
可以通过以下方式计算:
public int intDivByFive(int d) {
if (d < 0)
return intDivByFive(d + 5) - 1;
else if (d >= 5)
return intDivByFive(d - 5) + 1;
else
return 0;
}
上面的函数通过重复加减5
并计算您执行此操作的次数来工作。加数是负数。
理论上,这适用于所有整数。实际上,如果StackOverflowError
的大小太大,它将失败并显示d
。 (在撰写本文时,Java在任何现有版本中均未执行Euclidian。)
如何,这不是/
在Java中的含义。实际上,tail call optimization划分的定义是:
整数除法四舍五入为0。也就是说,为操作数
n
和d
生成的商是二进制数值提升(第5.6.2节)之后的整数,即为整数值q
在满足|d ⋅ q| ≤ |n|
的情况下其大小应尽可能大。此外,当q
和|n| ≥ |d|
和n
具有相同的符号时,d
为正,但是当q
和{{1 }}和|n| ≥ |d|
具有相反的符号。
因此,Java n
语义的正确实现是:
d
我们可以无休止地辩论哪个版本正确。但这取决于“除以5的数学函数” 的含义。我们没有上下文来确定这一点。
由于数学家通常 1 将除法表示为欧几里得除法,所以我认为第一个解更正确。但是,这是语义。真正的重点是,除法有多种不同的定义。
1-例如,我的旧副本《尼尔·麦考伊(Neal H. McCoy)的“抽象代数基础》(Fundamentals of Abstract Algebra)(1972年)使用了欧几里得的定义,但简称为该划分”。
答案 1 :(得分:1)
正如我所说,没有必要将基本算术运算设为递归函数。
如果您想要一个递归函数f(n)给出与n / 5相同的结果,则可以使用如下代码:
{ "dateTimeStamp" : "24-May-2020 8:15 AM PDT", "latitude" : 37.422, "longitude" : -122.084 }.
只需加或减5,直到达到0(或接近0)即可。