2012-05-24 1 views

답변

14

O (1)은 아니지만 확실히 재귀 적입니다.

public static int itFunc(int m, int n){ 
    Stack<Integer> s = new Stack<Integer>; 
    s.add(m); 
    while(!s.isEmpty()){ 
     m=s.pop(); 
     if(m==0||n==0) 
      n+=m+1; 
     else{ 
      s.add(--m); 
      s.add(++m); 
      n--; 
     } 
    } 
    return n; 
} 
+0

나는 m = 2, n = 1에 대해 4를 얻는다. n = 1, s = {2} -> n = 1, m = 2 -> n = 0, s = {3,1} n = 0, m = 3 -> n = 3 + 1 = 4. 내 대답이 f (2,1)에 잘못되지 않는 한? –

+0

네 수학이 틀렸다. 그가 제공 한 코드와 대조하여 확인했습니다. –

+0

어디서 잘못 됐습니까? 내 수학을 통해 나에게 정확한 답을 줄 수 있기 때문에 나는 단절된 것을보아야 만한다.: S –

5

이 숙제처럼 보이는, 그래서 나는 당신에게 대답을하지 않습니다하지만 올바른 방향으로 당신을 이끌 것입니다 : 당신이 밖으로 모두 나열 할

이 고장 재귀를 원하는 경우,이 유용 할 수 있습니다 진폭에 따라 m = {0 ... x} n = {0 ... y}가됩니다. 예를 들어

:이

m = 0, n = 0 = f(0,0) = M+N+1 = 1 
m = 1, n = 0 = f(1,0) = M+N+1 = 2 
m = 1, n = 1 = f(1,1) = f(0,f(1,0)) = f(0,2) = 3 
m = 2, n = 1 = f(2,1) = f(1,f(2,0)) = f(1,3) = f(0,f(1,2)) = f(0,f(0,f(1,1)) 
      = f(0,f(0,3))   = f(0,4) = 5 

, 당신은 당신이 사용할 수있는 비 재귀 관계 (비 재귀 함수 정의)와 함께 올 수 있습니다.

편집 : 따라서이 숫자는 the Ackermann function이고 총 계산 가능한 함수는 이 아니며 프리미티브 재귀입니다.

+0

@KDiTraglia 맞아요. 제 3의 방정식에서도 맞습니다. 고마워요. –

0

이것은 본인이 이미 조사한 올바른 버전입니다.

public static int Ackermann(int m, int n){ 
Stack<Integer> s = new Stack<Integer>; 
s.add(m); 
while(!s.isEmpty()){ 
    m=s.pop(); 
    if(m==0) { n+=m+1; } 
    else if(n==0) 
    { 
     n += 1; 
     s.add(--m); 
    } 
    else{ 
     s.add(--m); 
     s.add(++m); 
     n--; 
    } 
} 
return n; 
} 
+0

이것은 @ LightyearBuzz의 답변에서 아주 사소한 변형 인 것처럼 보입니다. Lightyear의'n + = m + 1 대신에 한 번에 하나씩 증가분을 처리하기 위해'n == 0 ' ;'. 당신은 정말로 모든 것을 직접 써 보았습니까? 아니면 대부분이 다른 대답의 (신용없이) 복사 되었습니까? –

+0

이 답변은 LightyearBuzz의 대답을 약간 변경하고 알려주지 않고 그의 코드를 사용하여 유감입니다. 나는 그의 코드가 모든 예제를 통과하지 못하도록 보았 기 때문에 그것을 수정하기 위해 약간의 변경을했다. 너가 그것을 좋아하지 않으면, 나는 그것을 삭제할 수있다. 하지만 사람들이 올바른 답을 볼 수 있기를 원합니다. ^^ –

+0

당신이해야 할 일은 답을 고쳐서 답을 수정하는 것입니다. (즉, 어떤 입력이 잘못된 답을 내는지). 예 : "LightyearBuzz의 대답은 'A (blah, blah)'에 대한 대답이 잘못되었습니다. 나는 그저 바뀌어서 해결했습니다. 전체 코드는 다음과 같습니다." –