【问题标题】:is incrementing a function argument a good way to update a "counter" using recursion?递增函数参数是使用递归更新“计数器”的好方法吗?
【发布时间】:2019-05-07 19:57:49
【问题描述】:

我正在练习递归,一直在看问题:

"编写一个递归程序,其输入是一个数组 A 和一个数字 x。程序应该打印出 x 在 A 中出现的次数"

这是我的工作解决方案:

public int countOccurrencesOfX_Recursive(int[] array, int x, int index, int occurrences) {
    if (index == array.length) {
        return occurrences;
    }
    if (array[index] == x) {
        return countOccurrencesOfX_Recursive(array, x, index+1, occurrences+1);
    } else {
        return countOccurrencesOfX_Recursive(array, x, index+1, occurrences);
    }
}

如果不引入更多函数参数,我想不出另一种方法。它看起来不太好,因为它取决于设置为 0 的次数参数,但用户可以输入他们喜欢的任何整数。我的问题是,这被认为是在使用递归时保持计数器的好方法吗?如果不是,那你会怎么做?

【问题讨论】:

    标签: java recursion counter


    【解决方案1】:

    对此的正常解决方案是使用用户调用的非递归 public 函数,该函数又调用递归的 private 函数。

    例如:

    public static int recursiveCount(int[] array, int value) {
        return recursiveCountInternal(array, value, 0, 0);
    }
    
    private static int recursiveCountInternal(int[] array, int value, int index, int count) {
        if (index == array.length) {
            return count;
        }
        if (array[index] == value) {
            count++;
        }
        return recursiveCountInternal(array, value, index + 1, count);
    }
    

    【讨论】:

    • 太棒了,只是将我的解决方案更改为您刚刚发布的完全相同的内容 :) 这是一个很好的建议,干杯
    • 其实可以用一种方法来做,不用count变量作为参数之一。
    【解决方案2】:

    我以前见过这种递归风格,看起来不错。

    你可以做一个重载函数,它只调用这个函数,初始 occurrences 为 0,如下所示:

    public int countOccurrencesOfX_Recursive(int[] array, int x, int index) {
        return countOccurrencesOfX_Recursive(array, x, index, 0);
    }
    

    并将递归函数设为私有。这将避免您担心用户输入任何数字。

    【讨论】:

      【解决方案3】:

      您可以从字符串的其余部分返回 1+ 个结果。

      private static int countOccurencesofIntInarrayRec(Integer[] nums, int target){
          if (nums == null || nums.length==0) return 0;
          int addNum = nums[0]==target?1:0;
          return  countOccurencesofIntInarrayRec(Arrays.copyOfRange(nums, 1, nums.length),target) + addNum;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 2022-01-14
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多