재귀함수의 고찰 문제) 재귀함수를 사용해서 리스트의 요소를 거꾸로 만들어주는 함수를 만드시요. 단, 반복문은 사용금지. def flip(some_list): # 코드작성 #테스트 some_list = [1, 2, 3, 4, 5] some_list = flip(some_list) print(some_list) 첫번째, recurrsion case 와 base case 생각해보기. - recursive case : 현 문제 범위가 너무 커서, 같은 형태의 작은부분 문제를 재귀적으로 푸는 경우 - base case : 이미 문제가 충분히 작아서, 더 작은 부분으로 나누지 않아도 풀수 있는 경우 base case부분을 생각해보아야한다.
계산을 안해도 알 수 있는 문제 some_list가 작다면, 1개의 요소가 있거나 아예 없다면 요소를 바꿔도 똑같다는 걸 알 수 있다. if len(some_list) == 0 or len(some_list) == 1: return some_list 그 다음은 recursive case를 생각해보자. [1, 2, 3, 4, 5]만 되도 계산이 복잡하다. 이걸 뒤집으려면 어떻게 해야할까? 우선, [1, 2, 3, 4] 와 [5]로 분리시켜 봅시다. [5]에다가 [1, 2, 3, 4]를 뒤집어서 더하면 되겠지요? [1, 2, 3, 4]는 익숙한 형태지요? [1, 2, 3, 4]를 뒤집는게 filpe([1, 2, 3, 4])입니다. 바로 우리가 찾던 더 작은 부분 이지요. [5] + filpe([1, 2, 3, 4]) 로 하면 되겟네요. 이걸 일반화 하면 some_list[-1] + flipe(some_list[:-1]) 입니다. 여기서 잠깐~! 리스트 슬라이싱을 조금 더 이해해봅시다. a = [1, 2, 3, 4, 5] 라는 리스트가 있을때 숨은 인덱스(위치)정보는 이렇게 됩니다. 0, 1, 2, 3, 4 리스트 : [1, 2, 3, 4, 5] -5, -4, -3, -2, -1 예시 몇가지로 개념을 잡아봅시다. a[0] = 1 입니다. 0번째 위치에 있는 요소는 1 이지요. a[4] = 5 입니다. 4번째 위치에 있는 요소는 5. a[-1] = 5 입니다. 거꾸로 한스텝 이동한 위치로 요소는 5입니다. 즉 a[-1] == a[4] 입니다. a[-2] == a[3] .. 자 더 나아가서 슬라이싱을 해봅시다. a[:2]는 a리스트에 위치 0 <= 리스트 < 위치 2 값을 슬라이싱 합니다. 즉, a[:2] = [1, 2] 가 됩니다. a[:-1]은 뭘까요? 아까 a[-1]은 거꾸로 한칸, 즉, 위치 4와 같다고 했습니다. 위치 4에 있는 값은 5지요? a[:-1] 은 위치 0 <= 리스트 < 위치 - 1(=위치4) 와 같습니다. [1, 2, 3, 4]가 나오겠네요. 쪼금 더 나아가서 리스트에서 맨끝에 위치한 요소만 리스트 슬라이싱하면 a[-1:] 이 됩니다. a리스트가 5개 인건 다 알기때문에 a[4] 하면 되겠지요 하지만 일반화로 들어가면 a의 길이를 모릅니다. 그러면 a[len(a)-1]을 하면 되지만, 궂이 코드를 길게 할 필요는 없지요? 이런 방법도 있구나 하면 됩니다. 마이너스 위치를 잘만 할용하면 함수를 잘 작성할 수 있습니다. 슬라이싱의 특성을 봅시다 a[:3] 은 이런 말입니다. 처음 위치부터 ~ 2번위치까지 리스트! 처음 위치는 0번 위치겠죠? 0 <= 리스트 < 3 a[2:4]는 2번위치부터~~ 3번위치까지 리스트! 2<= 리스트 < 4 a[-1:]은 -1본 위치부터 ~~~ 끝까지! -1<= 리스트 < 끝 즉, a[-1:]은 [5] 입니다. 여기서 추가 심화과정! a[-1] 과 a[-1:]은 뭘까요? 다 똑같은 5 아니냐구요? 네. 아닙니다. a[-1]은 숫자(int)타입 5가 나옵니다. 요소값이 뽑혀 나온거구요 a[-1:]은 리스트(list)타입 [5] 가 나옵니다. 리스트라는 이야기죠.
댓글 3개