【问题标题】:Using recursion to determine the number of digits使用递归确定位数
【发布时间】:2019-03-08 22:06:28
【问题描述】:

我目前被困在我不完全理解的一行代码上。 所以,我正在阅读书中的示例代码,其中一个“程序”使用递归来确定整数 n 中的位数。我卡在并且不完全理解的一行代码是:

if (number >= 10) {
    return numberOfDigits(number / 10) + 1;

例如,这使得数字 42 返回 2,这是它应该做的。但是这个函数究竟是如何返回 2 的呢? 42 除以 10 等于 4,2 或 4。加 1 是 5,那么它如何返回 2?

【问题讨论】:

  • 42 除以 10 是 4(整数除法)。 numberOfDigits(4) 是 1。1 + 1 = 2

标签: java recursion integer digits


【解决方案1】:

递归是一种调用方法来执行某些工作,同时将其余工作推迟到进行另一个递归调用的方法。在这里,“位数”递归方法表示数字中的位数等于1最后一位数字加上删除最后一位数字后剩余的位数。

return 语句中,+ 1 计算数字中的最后一位,而number / 10 执行截断整数除法以删除最后一位。递归调用计算数字中的数字,去掉最后一位。

您没有显示的是递归的基本情况,当数字是一位数(不大于或等于10)。那只是1 数字。 4 的值未计入计算中。该方法有效地计算数字,一次一个,直到没有更多的数字。每个数字有一个递归方法调用。

【讨论】:

    【解决方案2】:

    完整的方法大概是这样的:

    public int numberOfDigits(int number) {
        if (number >= 10) {
            return numberOfDigits(number / 10) + 1;
        }
    
        // base case: only one digit
        return 1;
    }
    

    通过检查,如果我们传递一个两位数,if 语句将被命中,它将返回输入 / 10 的递归调用,加一。假设输入是42。在这种情况下,它将返回numberOfDigits(42 / 10) + 1。我们知道numberOfDigits(4) 返回 1,所以这将返回总共 2,这是正确的。

    使用归纳推理,我们可以构建以使自己相信任意数量的任意长度。

    旁注:在我的旅行中,我经常看到使用if 语句首先处理基本情况,默认情况下会发生归纳情况。所以,我本来希望看到这段代码:

    public int numberOfDigits(int number) {
        if (number < 10) return 1;
    
        return numberOfDigits(number / 10) + 1;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2021-01-14
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      相关资源
      最近更新 更多