나는 기능이Ackermann 함수를 재귀 적 스타일로 다시 작성하는 방법은 무엇입니까?
public static int func(int M,int N){
if(M == 0 || N == 0) return M+N+1;
return func(M-1, func(M, N-1));
}
어떻게 비 재귀 스타일을 다시 작성해야? 아마도 구현 알고리즘입니까?
나는 기능이Ackermann 함수를 재귀 적 스타일로 다시 작성하는 방법은 무엇입니까?
public static int func(int M,int N){
if(M == 0 || N == 0) return M+N+1;
return func(M-1, func(M, N-1));
}
어떻게 비 재귀 스타일을 다시 작성해야? 아마도 구현 알고리즘입니까?
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;
}
나는 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)에 잘못되지 않는 한? –
네 수학이 틀렸다. 그가 제공 한 코드와 대조하여 확인했습니다. –
어디서 잘못 됐습니까? 내 수학을 통해 나에게 정확한 답을 줄 수 있기 때문에 나는 단절된 것을보아야 만한다.: S –
이 숙제처럼 보이는, 그래서 나는 당신에게 대답을하지 않습니다하지만 올바른 방향으로 당신을 이끌 것입니다 : 당신이 밖으로 모두 나열 할
이 고장 재귀를 원하는 경우,이 유용 할 수 있습니다 진폭에 따라 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이고 총 계산 가능한 함수는 이 아니며 프리미티브 재귀입니다.
@KDiTraglia 맞아요. 제 3의 방정식에서도 맞습니다. 고마워요. –
이것은 본인이 이미 조사한 올바른 버전입니다.
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;
}
이것은 @ LightyearBuzz의 답변에서 아주 사소한 변형 인 것처럼 보입니다. Lightyear의'n + = m + 1 대신에 한 번에 하나씩 증가분을 처리하기 위해'n == 0 ' ;'. 당신은 정말로 모든 것을 직접 써 보았습니까? 아니면 대부분이 다른 대답의 (신용없이) 복사 되었습니까? –
이 답변은 LightyearBuzz의 대답을 약간 변경하고 알려주지 않고 그의 코드를 사용하여 유감입니다. 나는 그의 코드가 모든 예제를 통과하지 못하도록 보았 기 때문에 그것을 수정하기 위해 약간의 변경을했다. 너가 그것을 좋아하지 않으면, 나는 그것을 삭제할 수있다. 하지만 사람들이 올바른 답을 볼 수 있기를 원합니다. ^^ –
당신이해야 할 일은 답을 고쳐서 답을 수정하는 것입니다. (즉, 어떤 입력이 잘못된 답을 내는지). 예 : "LightyearBuzz의 대답은 'A (blah, blah)'에 대한 대답이 잘못되었습니다. 나는 그저 바뀌어서 해결했습니다. 전체 코드는 다음과 같습니다." –
루프를 사용해 보셨습니까? – assylias
'while (M! = 0 || N! = 0) {\\ todo}' – BILL
숙제와 같은 냄새가 난다. 너 뭐 해봤 니? –