def iter(i, a):
if i == len(xs):
func(a)
print('*:{}'.format(a))
else:
iter(i + 1, a)
a.append(xs[i])
print('**:{}'.format(xs[i]))
iter(i + 1, a)
a.pop()
print('***:{}'.format(a))
iter(0, [])
power_set(print, [1,2,3,4])
① power_ser함수에 있는 iter(0, [])에 걸려서 iter함수가 실행됨.
② len(xs) == 4 이기에 if 문은 pass하고 else에 걸림.
③ else에서 젤 처음이 iter(1, a)가 됨. a = []인 상태이기에 a.append(xs[0])명령을 받아 a = [1]이 됨.
④ 그대로 바로 밑의 iter(1, [1]) 가 되기에, 다시 iter함수 발동되서 if 로 돌아감.
뭐 이런 느낌인가요?
누가 설명좀 해주실 수 있나요.. 이것만 2시간째 잡고 있네요...
이해는 했는데 뭐를 설명해줘야하냐
논리 순서가 어떻게 되나가 궁금합니다. 제가 생각한게 틀린거 같아서요
3번에서 틀림 iter(1, a)가 아니라 iter(4, a) 까지 갔다가 출력하고 iter(3, a)에서 append
대충 트리 형태로 그리면서 하면 이해갈꺼임
3번에서 iter(1,a)를 만나면 그 밑에 코드는 실행 안하고 다시 함수 제일 첫번째 줄로 돌아가서 실행되나요?
iter(1,a) iter(2,a) iter(3,a) iter(4,a) => if에서 걸려서 출력 append 출력 iter(3,a) iter(4,a) => if에서 출력 pop 출력
그리고 반복해서 뚝딱
iter(4,a)가 되었을때, 다시 함수 젤 윗줄부터 시작한다치면, if에걸려서 func(a)를 실행합니다. 그러면 그 뒷 단계로는 else 에 안걸리고 바로 끝나서 아무것도 안니게 되는게 아닌가요?
iter(1,a) iter(2,a)가 쌓여 있잖아
iter(1,a) iter(2,a)가 쌓여 있다고 하셨는데, iter(1,a) iter(2,a) iter(3,a)는 전부 else문 첫번째줄에서 iter(i + 1, a)로 에 걸려서 다시 위로 전부 올라간거 아닌가요?
iter(1,a) => iter(2,a) => iter(3,a) => iter(4,a) => if문에 출력 이러쿵 저러쿵 iter(1,a) => iter(2,a) => iter(3,a) => 완료 iter(1,a) => iter(2,a) => ?? 이렇게 계속 꼬리에 꼬리를 물고 됨
그럼 조금 화제를 바꿔서 이거랑 비슷한 문제인데,
https://dojang.io/mod/page/view.php?id=2353
재귀함수를
이용해 5팩토리얼을 구하는 문제.
5*4
4*3
3*2
2*1
까지는 이해했는데,
왜 더하라는 명령어도 없는데 출력값이 각자 더해서 120이 된거에요?
그림 31-5에 아주 자세히 나왓네
와 졸라 어렵네요.
아 대강 이해했습니다. 졸라 어렵네요
일단 재귀 이해하려면 컴퓨터 사이언스에서 이진 탐색 트리 개념을 알아야함
3번에 "됨." 이후부터 틀렸어
3번에서 iter(1,a)를 만나면 그 밑에 코드는 실행 안하고 다시 함수 제일 첫번째 줄로 돌아가서 실행되나요?
ㅇㅇ 맞음
감사합니다
와 진짜 코드 좆같네