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; } }
첫 번째 솔루션은 재귀 함수의 각 실행 컨텍스트에 대해 스택에 할당되는 추가 지역 변수k
和 cur
를 사용합니다. 이는 스택이 두 번째 솔루션보다 조금 더 빠르게 성장한다는 것을 의미합니다.
예, 각 로케일에는 스택 관리에 대한 고유한 제한 사항이 있습니다. 또한 일반적으로 스택의 최대 크기를 변경할 수도 있습니다. Java 및 C++를 참조하세요.
if
블록을 피하고 세 가지 사례를 모두 한 번에 처리할 수도 있습니다.
포인트
를 정적 변수(dp
와 유사)로 저장하고 이를 재귀 함수에 매개변수로 전달하지 않으면 스택 공간을 더 절약할 수 있습니다. points
存储为静态变量(就像 dp
一样)并且不将其作为参数传递给递归函数,则可以减少更多堆栈空间。
用于获取递归函数结果的堆栈由于测试中可能存在很大的输入数字 n
,分配给 int cur
n
으로 인해 int cur
에 대한 할당이 오버플로됩니다. https://www.php.cn/link/efc9ea3e0c2ed2c2481fe1252019266e
🎜위 내용은 for 루프를 사용할 때 stackoverflow 오류가 발생하지만 if 블록을 사용하여 동일한 작업을 수행하면 오류가 발생하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!