섹션2 재귀함수 질문이요
55분쯤인데 아무리 일주일만에 합격목표로 압축강의찍으셨다지만.. 풀이나 많은 부분들을 생략하시고 설명하시는 것 같아서 수강 멈추고 다시보고 이해하려해보고 그래도 안되면 질문해서 이해하고 이런 부분들이 생기네요 점점. 55분 빈도 문제인데 저 재귀함수가 결과적으로 어떻게 l의 갯수를 의미하는지 아직도 해석을 못했거든요. 저런 문제는 영상에서도 본인이 어려운 문제라고 언급하셨는데도, 왜 구체적인 풀이가 없는지 답답하면서 강의 결제한 거에 회의감까지 드네요.
답변 1
0
안녕하세요,
나름대로 설명을 하면서도 빠르게 넘어가려고 균형을 맞추려고 노력했으나,
저도 수강생분께서 상대적으로 어렵게 느껴지실 수 있다는 것에 공감합니다.
해당 문제를 최선을 다해서 다시 설명드리겠습니다.
설명을 드리기 전에,
이 문제는 난이도 자체가 상당한 편입니다. 무슨 말씀이냐면, 시험에는 이정도 나오기가 어렵습니다.
나온다고 하더라도 킬러문제급으로 하나 나오지 않을까 수준으로 생각하시면 됩니다.
일단, 기본 탈출 조건을 보겠습니다.
if (*str == '\0') {
return 0;
}지금 str은 함수의 입력값으로 char *str로 선언되어 있기 때문에 str 자체는 우리가 알 수 없는 메모리 주소로 되어있습니다.
그 메모리 주소는 hello world의 가장 앞을 가리키고 있고, 그 값(*)을 꺼내오면 h 문자 하나만 가져옵니다.
어쨌든, 메모리 주소를 왔다갔다 하면서 알파벳들을 휘젓고 다닐건데 그 휘젓고 다닐 때 우연치 않게 해당 값이 '\0' 널문자 (문자열 가장 끝에 있지만 실제로는 보이지 않는)가 되면 0을 리턴하겠다는 것입니다.
리턴의 0은 아시다시피 2가지 방법으로 쓰일 수 있습니다.
조건을 판단할 때는 C언어는 0을 거짓으로 판단하고, 그 외에는 그냥 우리가 다 알고 있는 숫자 0으로 해석할 겁니다.
NULL은 문자열 가장 마지막에 0을 돌려준다는 것은 알겠고, 그 다음의 else 부분을 봅시다.
함수명은 계속 써야하니 편의상 CF라고 줄이겠습니다. 양해 부탁드립니다.
처음에 들어왔더니
(*str == ch) + CF(str+1, ch) 라고 되어있습니다.
앞의 괄호는 조건문입니다. ==으로 앞과 뒤를 비교하겠다는 이야기입니다.
조건문은 참(1)이거나 거짓(0)을 반환합니다.
지금 ch는 뭔가요? 두번째 입력값으로 온 문자 'l' (엘) 입니다. 우리는 문자열 전체에서 l이 몇 개인지를 찾는 것이었죠?
str은 h 부분의 메모리를 가리키고 있습니다. 그것의 값(*)을 가져오라고 했더니, h였습니다. 해당 괄호는 h == l을 물어봅니다. 그래서 0을 리턴합니다.
최종적으로 0 + CF(str+1, l)이 됩니다. 그럼 이제 str+1을 값을 넣은 CF를 다시 호출합니다.
왜냐하면 아직 전체 리턴이 종료되지 않았기 때문입니다.
CF에 str+1, l을 다시 넣읍시다.
현재 상황: 아직 함수 진행 중. 앞에 0 + CF(str+1, l)
str+1은 뭔가요?
str은 메모리 주소라고 말씀드렸습니다. h라는 문자 값이 아니고 h의 집주소를 가리켰습니다.
거기에서 한 칸 옆으로 가라는 뜻입니다. h의 옆은 e가 살고 있는 메모리 주소입니다.
그곳의 값을 다시 꺼냅니다 (*str) 그리고 그것을 l과 비교합니다.
(*str == ch) ------------------> e == l 을 묻는 것입니다. 여기도 틀립니다. 그래서 0을 리턴합니다.
아직 끝나지 않았습니다. 0 + 0 + CF(str+1+1, l)로 다시 함수를 호출합시다.
현재 상황: 아직 함수 진행 중. 앞에 0 + 0 + CF(str+1+1, l)
요정도 오면 패턴이 보이실까요?
계속 옆집을 물어보고 있습니다. 메모리를 +1씩 옮겨가면서요.
h했고 e했고 이제 드디어 l이 오겠네요.
입력값으로 e 오른쪽 옆에 위치한 집의 위치를 전달했습니다. (str+1+1)
넘어가서 (*str == ch)부분이 이제는 1이 됩니다.
l == l 을 비교했기 때문입니다. (엘과 엘이 같느냐? 네 같습니다. 그래서 참인 1 반환)
이제는
0 + 0 + 1 + CF(str+1+1+1, l)인 상황이 되었습니다.
메모리 주소 값을 옆으로 옮겨가면서 계속 0 아니면 1을 누적했을 것입니다.
l을 만났을 때마다 1개씩 늘렸을 거에요.
가장 마지막인 d까지 비교해서 0을 리턴했을 겁니다.
아직도 함수 안 끝났습니다.
그래서 정리하자면
hello world는
0 + 0 + 1 + 1 + 0 + 0 (빈칸) + 0 + 0 + 0 + 1 + 0 (d부분) + CF(str+앞의 갯수만큼의 1, l)이 진행 중입니다.
드디어 마지막입니다.
이제는 맨 처음의 탈출 조건이었던 '\0'을 만납니다.
그래서 0을 리턴합니다.
지금까지의 먼 여정을 끝내고 모두 합한 다음에 최초로 호출한 함수로 쫘악 더해서 전달합니다.
그래서 문자열의 l의 갯수만큼 1이 더해져서 3이 됩니다.
이해에 도움이 되셨을까요?
필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)
0
51
2
26년 1회 실기 해설 강의
0
68
2
53번 4-1 자료 오류 있는 것 같습니다.
0
73
2
7번문제
0
60
2
C언어 변형문제 9번문제 Pdf 수정요청
0
48
2
메서드 오버드라드
0
51
2
실수
0
46
1
공부 우선순위 우선강의 알려주세요
0
90
1
생성자 호출순서 강의 10번 문제 30분대 질문입니다
0
49
2
25년 2회 기출 5:40 질문입니다.
0
43
2
모의고사1회 3번 파이썬문제
0
75
2
C언어 출제변형 6번 문제
0
50
2
c언어 출제변형 강의 질문
0
32
2
28:40
0
34
2
C : 언어 배열과 문자열 수업자료
0
31
2
파이썬 리스트, 딕셔너리 질문
0
43
2
모의고사 관련 질문 건
1
69
3
자료 내용 오류
0
64
2
정적 변수, 정적 메서드(static) v2
0
51
2
v1.2 와 v0.91 PDF
0
104
1
업캐스팅 (부모형태, 자식생성자)
0
51
2
정보처리산업기사 준비중입니다.
0
74
2
실기 D -6
0
105
2
(기출) 2024년 2회 기출문제 - 이론 포함 22분32초 질문입니다
0
60
3





