> Java > 본문

for 루프를 사용할 때 stackoverflow 오류가 발생하지만 if 블록을 사용하여 동일한 작업을 수행하면 오류가 발생하지 않습니다.

王林
풀어 주다: 2024-02-22 13:30:15
앞으로
917명이 탐색했습니다.

PHP 편집기 Strawberry는 Java 프로그래밍의 일반적인 문제를 탐색하도록 안내합니다. for 루프를 사용할 때는 스택오버플로 오류가 발생하지만 if 블록을 사용할 때는 오류가 발생하지 않습니다. 이 현상은 스택 오버플로를 일으키는 for 루프의 반복 호출로 인해 발생할 수 있으며 if 블록은 이러한 상황을 방지합니다. 이 문제는 문제의 근본 원인과 Java 메모리 관리 메커니즘에 대한 심층 분석을 통해 더 잘 이해하고 해결할 수 있습니다.

질문 내용

DSA 문제를 해결 중입니다

제가 사용하는 언어는 java se

입니다. 링크: https://www.codingninjas.com/studio/problems/ninja-s-training_3621003

내 솔루션이 정확하다는 것을 알고 있지만 테스트 사례 중 하나(테스트 사례가 표시되지 않기 때문에 테스트 사례가 무엇인지 모르겠습니다)의 경우 stackoverflow 오류가 발생하여 for 루프를 일부 if로 교체했습니다. 문, 수정되었습니다. 애초에 왜 오류가 발생했는지 궁금합니다

C++의 동일한 솔루션(for 루프 사용)도 오류 없이 작동합니다. 스택 공간이 Java와 C++에서 다르게 작동합니까?

두 메서드의 함수 호출 양은 동일하게 유지되지만 메서드 중 하나에서 스택오버플로 오류가 발생하는데 이는 말이 되지 않습니다. 따라서 호출 수가 스택 공간을 초과할 수 없습니다. 누군가가 이 문제를 해결해 줄 수 있다면 좋을 것입니다

이것은 for 루프가 포함된 코드입니다.

으아악

다음은 if 블록이 포함된 코드입니다.

public class solution {
    private static int dp[][];
    private static int rec(int day, int prev, int[][] points) {
        if (day == 0) {
            // no more days left.
            return 0;
        }

        if (dp[day][prev] != -1) {
            return dp[day][prev];
        }

        // merit points of ith task on nth day.
        int ans = points[day - 1][prev - 1];
        int mx = 0;
        for(int k=1;k<4;k++)
        {
            if(k!=prev)
            {
                int cur=rec(day-1, k, points);
                mx=math.max(cur,mx);
            }
        }
        

        dp[day][prev] = ans + mx;
        return ans + mx;
    }

    public static int ninjatraining(int n, int points[][]) {
        // dp table to memoize the solution.
        dp = new int[n + 1][4];
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j < 4; j++) {
                dp[i][j] = -1;
            }
        }
        int ans = 0;
        ans = math.max(ans, rec(n, 1, points));
        ans = math.max(ans, rec(n, 2, points));
        ans = math.max(ans, rec(n, 3, points));

        return ans;
    }
}
로그인 후 복사

Solution

첫 번째 솔루션은 재귀 함수의 각 실행 컨텍스트에 대해 스택에 할당되는 추가 지역 변수kcur를 사용합니다. 이는 스택이 두 번째 솔루션보다 조금 더 빠르게 성장한다는 것을 의미합니다.

예, 각 로케일에는 스택 관리에 대한 고유한 제한 사항이 있습니다. 또한 일반적으로 스택의 최대 크기를 변경할 수도 있습니다. JavaC++를 참조하세요.

if 블록을 피하고 세 가지 사례를 모두 한 번에 처리할 수도 있습니다.

으아악

포인트를 정적 변수(dp와 유사)로 저장하고 이를 재귀 함수에 매개변수로 전달하지 않으면 스택 공간을 더 절약할 수 있습니다. points 存储为静态变量(就像 dp 一样)并且不将其作为参数传递给递归函数,则可以减少更多堆栈空间。

用于获取递归函数结果的堆栈由于测试中可能存在很大的输入数字 n,分配给 int cur

재귀 함수 결과를 얻는 데 사용되는 스택 테스트에서 가능한 큰 입력 수 n으로 인해 int cur에 대한 할당이 오버플로됩니다.

https://www.php.cn/link/efc9ea3e0c2ed2c2481fe1252019266e

🎜

위 내용은 for 루프를 사용할 때 stackoverflow 오류가 발생하지만 if 블록을 사용하여 동일한 작업을 수행하면 오류가 발생하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!