
[CS50 Practice - #Recursive atoi]
C 프로그래밍 언어가 처음 만들어졌던 1970년대로 시간여행을 한다고 상상해 보세요. 당신은 문자열을 정수로 변환하는 방법을 찾기 위해 프로그래머로 고용되었습니다. (2주차에는 atoi라는 이와 같은 함수를 사용했을 수도 있습니다.) 개발 프로세스를 철저하게 진행하고 가장 효율적인 방법을 결정하기 전에 여러 가지 접근 방식을 시도해 볼 계획입니다.
이 문제에서는 루프를 사용하여 양의 정수를 처리하는 atoi의 간단한 구현부터 시작합니다. 재귀를 사용하는 구현으로 이를 재작업하고 싶습니다. 재귀 함수는 메모리 집약적일 수 있으며 항상 최선의 솔루션은 아니지만 재귀를 사용하면 더 간단하고 우아한 솔루션을 제공할 수 있는 몇 가지 문제가 있습니다.
(이 페이지 하단으로 스크롤하여 atoi 구현이 실제로 어떤 모습인지 확인하세요.)
Hints
재귀 버전의 변환에서는 마지막 문자부터 시작하여 정수 값으로 변환합니다. 그런 다음 문자열을 줄이고 마지막 문자를 제거한 다음, 단축된 문자열을 입력으로 사용하여 재귀적으로 변환을 호출하면 다음 문자가 처리됩니다.
재귀 함수를 만들 때마다 base case가 필요한 이유는 무엇입니까?
atoi의 실제 버전은 음수는 물론 선행 공백 및 숫자가 아닌 문자도 처리해야 합니다. 다음과 같이 보일 수 있습니다.
#include <stdio.h>
// Iterative function to implement `atoi()` function in C
long atoi(const char S[])
{
long num = 0;
int i = 0, sign = 1;
// skip white space characters
while (S[i] == ' ' || S[i] == '\n' || S[i] == '\t') {
i++;
}
// note sign of the number
if (S[i] == '+' || S[i] == '-')
{
if (S[i] == '-') {
sign = -1;
}
i++;
}
// run till the end of the string is reached, or the
// current character is non-numeric
while (S[i] && (S[i] >= '0' && S[i] <= '9'))
{
num = num * 10 + (S[i] - '0');
i++;
}
return sign * num;
}
// Implement `atoi()` function in C
int main(void)
{
char S[] = " -1234567890";
printf("%ld ", atoi(S));
return 0;
}
From [techiedelight.com/implement-atoi-function-c-iterative-recursive.](From techiedelight.com/implement-atoi-function-c-iterative-recursive.)
#include <cs50.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
int convert(string input);
int main(void)
{
string input = get_string("Enter a positive integer: ");
for (int i = 0, n = strlen(input); i < n; i++)
{
if (!isdigit(input[i])) // isdigit: char형이 숫자에 해당하는 ASCII 코드 값인지 아닌지 판별
{
printf("Invalid Input!\n");
return 1;
}
}
// Convert string to int
printf("%i\n", convert(input));
}
int convert(string input)
{
// TODO
int length = strlen(input); // 문자열 길이
// input[length-1] - '0'의 의미 :
// 마지막 문자(정수)의 아스키코드에서 정수'0'의 아스키코드를 빼면 원래의 숫자가 나온다
// ex) 숫자 8(ASCII: 56): 56 - 48 = 8
int last = input[length - 1] - '0';
if (length == 1) // Base Case
{
return last;
}
else
{
input[length - 1] = '\0';
printf("%s\n", input);
return (10 * convert(input) + last);
}
}
