当前位置: 首页 > 知识库问答 >
问题:

不知道如何防止java.lang.StackOverflowError

裴翰学
2023-03-14

我应该写一个递归(!)方法来计算整数数组中给定整数的出现次数,如果偶数,则返回true,如果为奇数,则返回false。这是我到目前为止的代码:

public static boolean evenNumberOf(int x, int[] arr) {

    if (arr == null || arr.length == 0)
        return false;
    int count = counting(x, arr, 0, 0);
    if (count % 2 == 0) {
        System.out.print("true");
        return true;
    } else {
        System.out.print("false");
        return false;
    }
}

public static int counting(int x, int[] arr, int index, int count) {

    if (arr[index] == x && index < arr.length) {
        return counting(x, arr, index++, count++);
    } else {
        return counting(x, arr, index++, count);
    }
}

它适用于

evenNumberOf(2, new int[] { 1, 2, 3, 2 });

但它给出了java.lang.StackOverflowError for

evenNumberOf(1, new int[] { 1, 2, 3, 2 });

我不确定如何防止这种无休止的递归循环,因为我是编程新手,这是我第一次使用递归。提前致谢。

共有1个答案

微生新翰
2023-03-14

任何递归都应该有一个停止条件和1个或多个递归调用

在本例中,停止条件是索引

public static int counting(int x, int[] arr, int index) {
    if (index >= arr.length) {
        return 0;//there are 0 x's between index and arr.length
    }

在处理了停止条件之后,您需要编写其余的内容:

public static int counting(int x, int[] arr, int index) {
    if (index >= arr.length) {
        return 0;//there are 0 x's between index and arr.length
    }
    int countAfterIndex = counting(x, arr, index+1);//the amount of x's starting from index+1
    if (x == arr[index]) {
        return countAfterIndex + 1;//there is 1 more to add
    } else {
        return countAfterIndex; //the amount of x's after index is the same as the amount from index.
    }
}

 类似资料:
  • 问题内容: 目前,我正在使用内置于python的应用程序。当我在个人计算机上运行它时,它不会出现问题。 但是,当我将其移至生产服务器时。它不断向我显示以下错误: 我进行了一些研究,得出的原因是,当服务器仍在忙于发送数据时,最终用户浏览器会停止连接。 我想知道为什么会发生这种情况,以及根本原因是什么导致它无法在生产服务器上正常运行,而我的计算机却可以正常运行。任何建议表示赞赏 问题答案: 您的服务器

  • 我试图实现一些东西作为“竞赛条件”。这个竞赛条件必须遵循这些情况: 同时触发两个HTTP调用。 返回第一个成功完成的调用的响应。 处理最后一个呼叫。(这里最重要的是我不能丢弃最后一个呼叫,我确实需要处理它的结果:无论它的状态、成功或失败)。 此代码示例是我实现的解决方案中最接近的一个: 在这个例子中,我使用了Flux.first方法,它帮助我返回了第一个调用,但是它丢弃(取消)了第二个调用,这是一

  • 我使用单信号推送通知。当android应用程序在前台收到通知时,它会创建一个带有通知的警报框。如何防止在收到通知时出现这种情况?

  • 问题内容: 由于许多node.js脚本遵循异步执行模式(以下示例),因此它们如何知道何时停止? 在以下代码中,节点如何确定在处理writeFile和适当注册回调之后,在回调运行之前,该进程应保持活动状态? 问题答案: 节点跟踪所有未完成的工作请求。您的fs.writefile()调用为I / O创建工作请求,并将您的回调添加到该请求。节点在启动I / O活动的同时将工作请求保存到其表中。到达函数末

  • 我正在尝试在数据库上注册一个项目(6小时或12小时)后的特定时间发送通知。当我只注册一个项目时,通知工作良好,但是,如果我在一段时间内注册了两个项目,第一个通知将被第二个覆盖。 我知道我必须将id添加到挂起的意图中,可能还需要将id添加到实际通知中,但是我对alarmManager类不是很熟悉,也不知道应该在哪里添加id。如何使这两个通知相互独立? NotificationHelper类: 我开始

  • 我知道如何通过selenium浏览结果页面,但我不知道如何浏览结果页面。我也尝试过mechanize,但这并没有让我走得更远。这就是我现在的处境: 最终的想法是将当事人、案件编号和提交日期作为字符串存储在一个数据库中。csv。当我现在打印输出时,我得到: 感谢任何帮助。