2009-10-27 6 views
1

자바에서 재귀 호출 Ackermann에 대한 연구를하고 있습니다. 나는 5 월 재귀 줄에서 오류를 얻고있다Java 재귀 학습, Ackerman 함수

return Ack(m - 1, Ack(m, n - 1)); 

사람이 무엇이 잘못을 지적 할 수 있다면 너무 감사합니다 (23). 당신은 최대 재귀 깊이를 초과했습니다

/*enter code here 

    Ackerman's function, A(m, n) is defined: 
    A(0 , n) = n + 1 for n >= 0 
    A(m , 0) = A(m – 1 , 1) for m > 0 
    A(m , n) = A(m – 1 , A(m , n - 1)) for n >= 0 

    */ 

    public class AckFun { 

    public static int Ack(int m, int n) { 

     if (m == 0) { 
     return 2 * n; 
     } else if (m >= 1) { 
     if (n == 0) { 
     return 0; 
     } else if (n == 1) { 
     return 2; 
     } else { 
     return Ack(m - 1, Ack(m, n - 1)); 
     } 
     } 
     return n; // Not sure what to return here, Eclipse suggested this. 
    } 

    public static void main(String args[]) { 
     System.out.println(Ack(3, 4)); 
    } 
    } 
+0

Eclipse에 "return n"이 필요한 이유는 그렇지 않으면 섹션을 반환하지 않기 때문입니다. 귀하의 방법은 다음 형식의 양식입니다. if (a) else if (b) ... 그러나 a 또는 b가 true가 아닌 경우 두 블록 중 하나가 종료됩니다. –

+2

나는 그것을 좋아한다 ** java.lang.StackOverflowError ** – beggs

+0

웹 사이트가 마음에 드십니까? – Benzle

답변

6

당신은 당신의 스택을 더 크게 만들 필요가 :

http://thilinamb.wordpress.com/2008/12/22/how-to-increase-the-java-stack-size/

가 유래없이 실행 큰 스택으로 만 제공 0

편집 : 코드는 그것이 제공하는 이유 즉, 잘못 오류. 정의가 말하는대로 정확하게 코드를 다시 작성하십시오.

PS. 숙제 문제를위한 소스 코드를 게시 한 것에 대해 저를 비난하지 마십시오. 프로그래밍을 배우는 가장 좋은 방법은 다른 사람의 코드를 읽고 이해하는 것입니다.

+0

내가 뭔가 다른 것 같아요, 나는 대답이 125에 대한 값이어야한다고 생각합니다 (3 , 4), 더 큰 스택 처리 (아직)를 필요로하지 않을만큼 충분히 작다. – Benzle

3

안보국의

. 그것은 Ackermann 기능의 특징 중 하나입니다. :)

Ack(3,3)과 같이 작은 숫자로 호출하면 스택 오버플로가 발생하지 않습니다.

자바의 재귀 깊이 제한을 늘릴 수는 있지만 반드시 좋은 해결책은 아닙니다. 이것은 Java의 내장 호출 스택을 사용하지 않고 데이터 구조 (스택)의 각 호출을 추적하도록 프로그램을 변환하는 연습 일 수 있습니다. 함수 호출의 결과를 기록하는 memoization을 사용하여 동일한 결과를 반복해서 계산하지 않아도됩니다.

+0

(3, 3)에 대한 올바른 출력은 65536입니다. 나는 (3, 4)에 대해 125라고 생각했습니다. ? – Benzle

+0

좋아, 그럼 당신은 논리 오류가 :) –

+0

스택 오버 플로우는 지금까지 자신의 코드에서 문제가되지 않습니다 ... – m13r

0

앞에 오면 '기타'가 필요하지 않습니다.

if (m == 0) return n + 1; 
if (n == 0) return ack (m - 1, 1); 
return ack (m - 1, ack (m, n - 1));