필자는 fibonacci 시퀀스 반환에서 n을 반환하는 입력을 받으면 피보나치 수 반환기를 만들려고했습니다. 나는 그것을 재귀 적으로 만들고 공간의 복잡성을 낮추려고 노력했다. (나는 새로운 변수를 인스턴스화하지 않는다.) 나는 Integer 객체를 값으로 사용하며, 값의 오버플로 (음수 값을 반환 함)를 알고 있지만 실제로는 의도적으로 (교육용으로) 사용합니다. 함수는 다른 함수보다 공간 복잡성이 적기 때문에 smartestFib라고합니다.Java 재귀 메소드 Integer 객체를 사용하는 StackOverflowError
문제는 smartestFib (n)을 130 이상으로 호출 할 때 발생합니다. 그것은 완벽하게 잘 작동 (오버플로 간주) 129 이하,하지만 130 이상에 대한 예외를 제공합니다. 주요 문제는 예외가 실제로 무엇인지 알 수 없다는 것입니다. 오류가 너무 많아서 처음 오류를 볼 수 없으므로 오류의 원인을 정확히 알지 못합니다. 나는 오류의 유형을 모르기 때문에 나는 그것을 잡지 못합니다.
내 코드는 다음과 같습니다
private static int smartestFib(Integer goalNum)
{
if (goalNum < 2)
return 1;
else
return smartestFib(goalNum-2, 0, 1,1);
}
private static int smartestFib(Integer goalNum, Integer currentNum, Integer lastValue, Integer beforeLastValue)
{
if (goalNum == currentNum)
return lastValue + beforeLastValue;
else
{
return smartestFib(goalNum, currentNum + 1, lastValue+beforeLastValue,lastValue);
}
}
문제의 임의성이 내가 모르고 나는 몇 가지 기술적 인 문제가 있는게 틀림 없어 때문에 나는이 문제에 어떤 도움을 주셔서 감사합니다 정말 것이며, 내가 단서가 없다 볼 곳. 미리 감사드립니다.
편집 : Apparently 수 있습니다 StackOverflowError, 많이 고마워! 하지만 이제는 궁금해합니다. 다른 기능이 더 높은 공간 복잡성을 가지고 있으며이 문제가 발생하지 않습니다. 방법?
private static int smarterFib(int goalNum)
{
assert (goalNum >= 0): "The variable goalNum may not negative.";
if (goalNum < 2)
return 1;
else
{
ArrayList<Integer> sequenceList = new ArrayList<Integer>(Arrays.asList(new Integer[] {1,1}));
return smarterFib(goalNum-2, sequenceList);
}
}
private static int smarterFib(int goalNum, ArrayList<Integer> priorValues)
{
assert (goalNum >= 0): "The variable goalNum may not negative.";
assert (priorValues != null): "The array priorValues has not been initialized.";
if (goalNum <= priorValues.size()-2)
return (priorValues.get(priorValues.size()-1) + priorValues.get(priorValues.size()-2));
else
{
priorValues.add(priorValues.get(priorValues.size()-1) + priorValues.get(priorValues.size()-2));
return smarterFib(goalNum, priorValues);
}
}
이 하나가 문제 및 수행 나의 새로운 일이 발생하지 않는 이유는 볼 수 없습니다 ..
그건 [StackOverflowError] (http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – resueman