문제: 함수 fib(a,b,x)를 입력(단 a,b,x는 무조건 int형)하면
a와 b를 피보나치 수열의 최초의 숫자로 하고
b부터 시작하는 x개이하의 피보나치 숫자를 list의 형태로 출력하라.
문제 설명이 음.. 그렇네요.. 네.. ㅠㅠ
예시를 통해 제가 어떤 함수를 구현하고 싶은지 알아봅시다.
Ex) fib(1,2,3) >> [2,3,5]
fib(2,4,5) >> [4,6,10,16,26]
기본 틀
def fib(a,b,x):
F = [ ]
print[F]
이 문제를 보고 제가 했던 생각들
1. 리스트의 바깥에서 a,b를 더해서 F(리스트)에 넣자
처음에는 이 아이디어을 가지고 코딩을 했는데 너무 어려웠습니다.
숫자를 정해진 갯수(x)이하까지 더하고 각각을 어디엔가 저장해야했던 것..
계속해서 새로운 변수들을 만들어서 저장하고 그걸 리스트에 넣는다?? 도저히 못하겠네요 ㅠㅠ
2. 리스트를 이용해서 a,b를 더하게 하고 그 값을 F(리스트)에 넣자
구글링을 통해 힌트를 얻을 수 있었습니다. '파이썬 피보나치'만 검색해도 수많은 사이트들이 설명을 해주었는데 문제가 완벽히 똑같진 않지만 리스트의 안쪽에서 해결하는 설명이 많았습니다.
해결 방안
1) 일단 리스트에 a와 b를 append를 이용해 추가시킵니다
def fib(a,b,x):
F = [ ]
F.append(a)
F.append(b)
2) 반복문 for를 이용해서 a와 b를 더합니다.
현재 a와 b는 각각 F[0], F[1]로 나타낼 수 있습니다. 그리고 F[0]+F[1]한 값을 곧바로 F에 집어넣어줍니다.(F[2]) 그 다음 F[1]+F[2}한 값을 곧바로 F에 집어넣어줍니다.(F[3]) 이런 식으로 해서 x이하의 갯수까지 더하면 됩니다.
반복문 for의 설정:
F[0]+F[1]부터 해서 F[x]+F[x+1]까지 더한값을 F 리스트에 넣어주어야 합니다.
따라서 반복문은
for c in range(0,x+1):
F.append(F[c]+F[c+1])
3) F 리스트의 맨 첫번째 요소를 없애줍니다.(del 이용)
del(F[0])
최종 코드는
def fib(a,b,x):
F = [ ]
F.append(a)
F.append(b)
for c in range(0,x+1):
F.append(F[c]+F[c+1])
del(F[0])
print(F)
인줄 알았는데 아닙니다.. ㅠㅠ 실제로 실행해보면
fin(1,2,3) >> 원하는 리스트: [2,3,5]
실제 리스트: [2,3,5,8,13]
원하는 리스트의 요소에서 무려 2개나 추가되었죠..
이유: range(0,x+1) , 잘못된 범위 설정
(예인 fib(1,2,3)을 살펴봅시다.
원하는 리스트: [2,3,5]
실제 더해지는 값
F[0] + F[1] => 3
F[1] + F[2} => 5
F[2] + F[3] => 8
F[3] + F[4] => 13)
1) 0부터 더해지기 때문에 1부터 값을 센 저의 실수.. ㅠㅠ
실제 더해질때는 F[0]부터 시작하기 때문에 범위를 range(0, x+1) 에서 range(0, x)로 줄입니다.
2) 이미 리스트에 요소 한개가 존재
우리는 처음에 리스트에다가 요소 2개를 추가하고 후에 1개를 제거했습니다.
따라서 이미 리스트에는 요소1개가 존재하기때문에 범위를 range(0, x)에서 range(0, x-1)로 한번 더 줄입니다.
최종코드
def fib(a,b,x):
F = [ ]
F.append(a)
F.append(b)
for c in range(0,x-1):
F.append(F[c]+F[c+1])
del(F[0])
print(F)