递归定义数学函数

时间:2020-05-31 01:38:56

标签: java recursion

我有一个整数除以5的数学函数

intDivByFive(N)= N / 5

有人告诉我要递归定义它。

有人可以解释我在这里被要求做的到底是什么吗?

2 个答案:

答案 0 :(得分:2)

我假设您要递归计算N/5,而无需使用/运算符。 (这是不必要且不切实际的,但在这种情况下我们可以忽略它。)

(请注意,在此答案的其余部分中,我将N重命名为D以与JLS中使用的术语保持一致。)

对于除法d / n的{​​{3}}定义,我们需要找到qr,使d = q * n + r0 ≤ r < |n|处。

因此,对于d / 5q可以通过以下方式计算:

   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。也就是说,为操作数nd生成的商是二进制数值提升(第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)即可。