내가 당신이 당신이 구현하려고 접근하는 것입니다 필요한 이해 것으로 보인다.
당신은
void recuverse(char s[])
{
recuverse(s , std::strlen(s));
}
void recuverse(char s[], size_t n)
{
if (!(n < 2))
{
std::swap(s[0], s[n-1]);
recuverse(s + 1, n - 2);
}
}
같은 기능을 쓸 수 그러나 그것이 재귀 함수입니다 void recuverse(char s[]);
작동하지 때문에 그것은 잘못된 솔루션입니다. 재귀적인 함수 void recuverse(char s[], size_t n);
입니다. 그러나 귀하의 임무에 따라 재귀가되어야하는 것은 void recuverse(char s[]);
입니다.
그래서 유일한 해결책은 다음과 같습니다.
#include <iostream>
#include <utility>
char * recuverse(char s[])
{
if (*s )
{
char *p = s;
do
{
std::swap(*p, *(p + 1));
} while (*p++);
recuverse(s);
std::swap(*p, *(p - 1));
}
return s;
}
int main()
{
char s[] = "abcde";
std::cout << s << std::endl;
std::cout << recuverse(s) << std::endl;
return 0;
}
출력은 또한 당신의 코드를 대체 할 수있는이 재귀 함수는 std::swap
제외하고는 어느 쪽도 표준 기능을 사용하지
abcde
edcba
입니다. :)
내가 함수가 반환 형식을 가지고 것을 선호 char *
표준 C 문자열 함수와 비슷한 방식입니다.이 함수가 반환 형식 void
을 것이라고하려면 다음이 역 기능을 strlen
이 작업은 "ABC"를 간단한 예를 사용하여 단계별로 고려할 수있는 표준 기능없이 어떻게 작동하는지 이해하는
void recuverse(char s[])
{
if (*s )
{
char *p = s;
do
{
std::swap(*p, *(p + 1));
} while (*p++);
recuverse(s);
std::swap(*p, *(p - 1));
}
}
처럼 보일 것입니다.
그래서 우리는 그것이 종료 제로를 교환 할 때까지이 abc0
while 루프로
while (*p++) ...
스왑 문자를 기입 할 제로
abc\0
종료와 함께 문자열을 가지고있다. 첫 번째 재귀 호출에서
루프는 다음
abc0
bac0
bca0
bc0a
이제 함수가 자신을 호출하지만 지금은 문자열이 루프에 따라서
bc0
모양을하고있다
bc0
cb0
c0b
다음 재귀 호출에서
인수는 두 문자 그래서 마침내
0c
를 교환하는 기능이 빈 문자열로 호출 루프에서
C0
될 것입니다. 그래서 그것은 단순히 우리는 영을 종료 TP의 올바른 위치를 이동해야
0cba
처럼
전체 문자열이 지금 보이는 것을 고려 호출자에게 제어 및 발신자 스왑 문자열의 마지막 문자를 반환 문자열 끝에. 이것은 루프 이후의 스왑으로 수행됩니다. 이다
0c => c0
--------
c0b => cb0
-----------
cb0a => cba0
모든 :)
** 중재자 주를보십시오. ** 내가 코멘트를 제거했습니다. 대부분은 도움이되지 않았다. OP가 물었던 문제에 초점을 맞추고'void main()'을 쓸 수 있는지에 대해 걱정하지 마라. –