2016-07-16 2 views
-2

질문은 숫자를 가져 와서 그것을 거울처럼 만드는 것입니다. ? 당신은 왜C에서 임무 재귀에 대해 (Visual Studio 15)

을 알고

int strToRevInt(int* str) 
{ 
    if (*str <10) 
    return *str; 

    return strToRevInt((*str)/10)*10 + (*str%10); 
} 

void main() 
{ 
    int a = 123; 
    int d =strToRevInt(&a); 
    printf("%d", d); 
} 

내가 한 라운드가 "말한 뒤에 어떤 이유로 및 STR을 디버깅하려고했습니다. 이 내가 쓴 것입니다 수 123 (321)

에 켜집니다 말할 수

들으

모든
+1

이 코드는 실행 한 코드가 아니며 결과도 아닙니다. 그 안에는 작은 따옴표를 '말하기'능력이 없습니다. 또한 재귀 호출이'int'를 인수로 전달하려고 시도하지만 함수가'int *'매개 변수를 요구하기 때문에 컴파일되지 않아야합니다. (왜, 그런데, int 매개 변수가 필요하지 않은가?!?!) – Hurkyl

+0

안녕하세요, 생각대로 코드를 수정 해주시겠습니까? 나는 값 대신 주소를 전달하는 것이 더 나은 것을 배웠기 때문에 int *를 사용하지 않았다. – ofiram

+0

첫 반응은 C 또는 C++인가? 그러나 그때,'void main'도 아니다. 누구든지 교육을받은 사람이 가르침을해서는 안된다는 또 다른 힌트. "Delivering"은 C 또는 C++에서 사용되는 용어가 아니지만 _passing_의 나쁜 역행본이 될 수 있습니다. 그러나 더 중요한 것은 C와 C++ 모두에서 달리 수행 할 좋은 이유가 없으면 일반적으로 값을 전달한다는 것입니다. – MSalters

답변

0

먼저 단순화 할 수 int * 당신은 코멘트에 말 :

,691.

난 당신이 포인터의 크기는 실제로 구조의 크기보다 훨씬 작은 큰 구조를 반환하는 경우에 사실 값

대신 주소를 제공하기 위해 더 나은 배웠다.

32 비트 아키텍처에서 메모리 포인터는 32 비트 (4 바이트)입니다. 일반적으로 int 유형은 해당 아키텍처에서 4 바이트입니다. 보시다시피, 코드는 사용하는 것과 상관없이 동일한 "데이터 양"을 반환합니다. 포인터는 코드 복잡성을 증가 시키므로 이점이 없습니다.

그러면 함수 논리에 결함이 있습니다. 입력 123의 경우 (1 * 10 + 2) * 10 + 3이 출력되고 다시 123이 출력됩니다.

나를 위해 견적을 보내지 마십시오.하지만 임시 변수가 필요합니다. 다음과 같이 제안 해 드리겠습니다.

int strToRevInt(int str, int rev) 
{ 
    if (str == 0) 
     return rev; 

    return strToRevInt(str/10, rev * 10 + (str % 10)); 
} 

void main() 
{ 
    int a = 123; 
    int d = strToRevInt(a, 0); 
    printf("%d", d); 
} 
관련 문제