이것은 동전 교환 방법을 계산할 수있는 재귀 함수이며 완벽하게 작동 할 수 있습니다.재귀에서이 두 가지 방법의 차이점은 무엇입니까?
/*** WAY 2 ***/
return (s.stk[++s.top] = k, cc(n - d[k - 1], k)) + (s.top--, cc(n, k - 1));
// |<----- A ----->| |<----- B ----->|
그들은 해당되지 않습니다 다음과 같이 내가 두 의견 사이의 코드를 변경하는 경우
int cc(int n, int k)
{
if (n < 0 || k == 0)
return 0;
else if (n == 0)
return 1;
else
{
/*** WAY 1 : START ***/
s.stk[++s.top] = k;
int tmp = cc(n - d[k - 1], k);
s.top--;
return tmp + cc(n, k - 1);
/*** WAY 1 : END ***/
}
}
하지만, 왜 그것이 잘못된 답을 얻기 시작?
P. 그런 식으로 작성하는 것이 좋은 방법은 아니지만 (방법 2), 나는 그것이 왜 효과가 없는지 궁금합니다.
편집 :
우리가 A
또는 B
먼저 할 것인지, 내가 어떤 실험을하려고 노력 모르겠어요하지만.
결론은 return A+B;
도 아니고 return B+A;
도 올바른 답을 얻을 수 없다는 것입니다.
그렇지 않습니다. 또한이 코드는 완성 된 코드이므로 스택 오버플로가 아닌 코드 검토에이 코드를 넣으십시오. – bobtheboy
UB로 보입니다 (정의되지 않은 동작). – BLUEPIXY
왜? 이 코드에는 UB가 있습니까? –