【问题标题】:Java Recursive function that determines if there are two consecutive numbers which are equal确定是否有两个连续数字相等的Java递归函数
【发布时间】:2020-04-25 07:04:07
【问题描述】:

我对如何递归编写这段代码感到很困惑。我必须创建一个方法来确定是否有两个连续数字在数组的特定范围内相等。

应该返回 true 的数组示例如下:3、2、2、1 其中 i=0 和 j=3。

到目前为止,这是我的代码,但它没有正确实现问题。

private static boolean problem1(int[] arr, int i, int j)
    {
        int[] newArray = Arrays.copyOfRange(arr, i, j+1); //Create a new array that only contains the specific given range

        for(int x = i; x < newArray.length; x++){ 
            int y = (x+1);
            if(newArray[x]==newArray[y]){
               return true;
            }
        }
        return false;
    }

【问题讨论】:

  • 1) 您的解决方案不是递归的。 2)适当的解决方案不需要复制数组。 3) 适当的解决方案不会使用forwhile 循环。递归将(实际上)进行循环。
  • 这似乎是一个关于递归的家庭作业问题。你了解递归的原理吗?似乎您正在尝试使用迭代解决方案而不是递归解决方案来解决问题。另外,对于它的价值,请注意,在您的循环中,如果x=newArray.length-1 并且您设置y=x+1 然后newArray[y] 将等同于执行newArray[newArray.length] 并且会给您一个ArrayIndexOutOfBoundsException
  • 非常感谢所有评论的人,非常感谢您的帮助!

标签: java arrays recursion range


【解决方案1】:
private static boolean problem1(int[] A, int i, int j) {
    if (A == null || A.length == 1 || A.length == 0 || i == j) {
        return false;
    }

    if (A[i] == A[i + 1]) {
        return true;
    }
    i++;
    return problem1(A, i, j);

}

【讨论】:

    【解决方案2】:
    private static boolean problem1(int[] arr, int i, int j) {
        if (arr == null || arr.length == 1 || arr.length == 0 || i == j) {
            return false;
        }
    
        if (arr[i] == arr[j])
            return true;
    
        i++;
        return problem1(arr, i, j);
    
    }
    

    【讨论】:

    • ij 可能不是必需的,但它们使解决方案更加高效。您的方法每次都复制整个数组,并且简单地使用int 索引而不是每次调用Arrays.copyOfRange 对于大型输入会更有效。
    【解决方案3】:

    在代码中找到递归函数的解释

    import java.util.Arrays;
    import java.util.Random;
    
    public class RecurseFunc {
    
        public static void main(String[] args) {
    //        int[] arr = new int[]{3,2,2,1};
            int[] arr = new int[]{3,2,4,1,1};
    //        System.out.println(problem1(arr,0,3));
    //        System.out.println(problemRec(arr, 4,-1,0));
            System.out.println(problemRecWrapper(new int[]{-1,2,4,1,0}, 4,  0));
        }
    
        static boolean  problemRecWrapper(int[] arr, int arrLastIndex, int currentIndex) {
            return problemRec(new int[]{-1,2,4,1,0}, 4, -1, 0);
        }
    
        /**
         *
         * @param arr      Complete array
         * @param arrLastIndex - Starting index point
         * @param lastIndex - Last element index
         * @param currentIndex - Current arr index
         * @return
         */
        static boolean  problemRec(int[] arr, int arrLastIndex, int lastIndex, int currentIndex) {
            if(currentIndex > arrLastIndex) {
                return false;
            }
            if(lastIndex > 0 && arr[lastIndex] == arr[currentIndex]) {
                return true;
            }
            currentIndex++;
            return problemRec(arr, arrLastIndex,lastIndex,currentIndex);
    
        }
    }
    
    
    

    【讨论】:

    • 请注意,您似乎使用变量 ij 与原始问题不同。此外,不需要“最后一个元素”参数,您只需将当前元素与下一个元素进行比较即可。如果输入数组在起始索引处有 -1,即使它实际上没有任何两个相同的元素,您当前的方法实际上也会错误地返回 true
    • 感谢您指出@MihirKekkar > 我尝试将我的变量名称重构为最初在 Q 中使用的名称,但现在更新了我的代码以使用一些有意义的名称。
    • 还有一个问题,如果我调用problemRec(new int[]{-1,2,4,1,0}, 4, -1, 0),当该数组中没有连续相等的数字时它会返回true。
    • @MihirKekkar 修复了代码。我希望您不要期望围绕用户输入进行更多验证。
    猜你喜欢
    • 2016-10-12
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多