난 그냥 워밍업을하고 있었는데, 나는이 우연히 :신비한 stackoverflow 오류?
http://codingbat.com/prob/p145416
세 가지 방법의 차이는 내가 재귀 호출에서 시작 매개 변수에 추가하는 방법입니다.
처음에는 두 번째 함수를 사용하여 해결했지만 나에게 유명한 stackoverflow 오류가 발생했습니다. 첫 번째는 나에게 stackoverflow 오류를주지 않는다. 이 사이트에 문제가 있습니까? 아니면 1과 2의 차이가 있습니까? 즉, Java 언어의 미묘한 부분입니까?
public boolean groupSum(int start, int[] nums, int target) {
if (start >= nums.length)
return (target == 0);
return groupSum(start+1, nums, target - nums[start]) || groupSum(start+1,
nums, target);
}
------------ 유동 오류 원인이 위에 스택 --------------
public boolean groupSum(int start, int[] nums, int target) {
if (start >= nums.length)
return (target == 0);
return groupSum(start++, nums, target - nums[start]) || groupSum(start++,
nums, target);
}
public boolean groupSum(int start, int[] nums, int target) {
if (start >= nums.length)
return (target == 0);
return groupSum(++start, nums, target - nums[start]) || groupSum(++start,
nums, target);
}
신비한 stackoverflow 오류가 없습니다. 단지 재귀 적 메서드가 중단되지 않았다는 것을 의미합니다. 왜? 아마도 틀린 디자인의 기본 케이스 일 겁니다. 또한 Java *에서만이 문제가 발생한다고 말하지 마십시오. 다른 프로그래밍 언어에서도 발생할 수 있습니다. –
또한 나는 O (2^n)의 복잡성을 가지고 있기 때문에 이러한 기능이 얼마나 비속적인지 알게됩니다. 나는 인터뷰를 위해 워밍업을하고 있으며 재귀와 연습이 필요하다. – LLL
세 함수 모두 동일한 기본 사례를 사용합니다. 그것들은 단지 내가 시작하는 방법에있어서 차이가 있습니다. 나는 그 질문을 분명히 할 것이다. – LLL