파이썬_실전 프로젝트

프로젝트 오일러 2번문제 - 피보나치 수열

차례로 두 숫자씩 더해서 새로운 수를 만드는 수열인 피보나치 수열입니다. 처음에는 불규칙한 수열인거 같지만, 항이 커질수록 어떤 일정한 비율을 가진 등비수열에 가까워집니다. 그 공비가 황금비율이라고 부르는 (1.6...)의 비율입니다.

문제는 400만 이하의 피보나치 수중 "짝수"만의 합을 구하는 문제입니다.

 

Even Fibonacci numbers

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

 

 

피보나치 수열 만드는것 외엔 루프문과 조건문 사용은 1번 문제와 유사합니다.
 

 

방법 1

첫번째 피보나치 수열 만드는 방법입니다. 이전항과 현재항을 합해서 다음항을 만드고, 루프값을 1을 증가하는것이 아니라, "다음항"값으로 넘겨주는 것입니다.

i=1; previous_i = 1
while i<=100:
    print(i)
    next_i = previous_i + i
    previous_i = i
    i = next_i
1
2
3
5
8
13
21
34
55
89
i=1; previous_i = 1
while i<=4000000:
    next_i = previous_i + i
    previous_i = i
    i = next_i
print("total:",total)
total: 4613732

 

방법 2

좀더 짧게 표현하면 아래와 같습니다.

a=1;b=1
while b<=100 :
    print(b)
    a,b = b,a+b
1
2
3
5
8
13
21
34
55
89

a,b= b, a+b 는 a (이전항)자리에 b(현재항)를, b(현재항)자리에는 a+b(다음항) 를 "동시에"대입하라는 의미인데, 얼핏보면, 순환논리의 오류(?)에 빠질것 처럼 보이지만, 파이썬에서는 잘 작동하더라구요.

a=1;b=2;total=0
while a<=4000000 :
    if a%2==0:
        total+=a
    a,b = b,a+b
print("total:",total)
total: 4613732

 

방법3
a,b=1,1
total = 0
maxnum = 4000000
 
while b <= maxnum:
    if b % 2 == 0:
        total += b
    else:
        pass
    a,b=b,a+b

print(total)

포럼에 들어가니 이렇게 푼 사람도 있던데, 방법2와 유사하긴 한데, 특이한건 else: pass 구문을 썼네요. 굳이 없어도 결과는 나오는데, 다른 차이가 있는지는 저도 좀더 알아봐야겠네요.

댓글

댓글 본문