ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 31.5 심사문제 : 재귀호출로 피보나치 수 구하기
    코딩도장 심사문제모음 2020. 11. 4. 16:42
    728x90
    반응형

    표준 입력으로 정수 한 개가 입력됩니다(입력 값의 범위는 10~30). 다음 소스 코드를 완성하여 입력된 정수에 해당하는 피보나치 수가 출력되게 만드세요.

    피보나치 수는 0과 1로 시작하며, 다음 번 피보나치 수는 바로 앞의 두 피보나치 수의 합입니다.

    사용한 코드

    1. def

    2. if

    3. return

    첫 접근 방법

    0, 1로 시작하는점

    호출하는 인수의 개수가 "하나"인점

    수열의 일정 규칙이 있다는점을 파악하여 문제를 해결 할 수 있다.

    풀이

    코드를 작성하기 전 문제부터 살펴보자

    입력값 n 과 결과값을 나열하여 수열이라 생각해 관계를 살펴보자.

    # n

    # 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21...

    # 결과

    # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946...

    문제에서도 제시해주지만 0, 1 시작 후 2부터는 바로 두 앞의 수의 합이 결과로 반환되는점이다.

    1. 함수 정의를 할때 피보나치의 수는 0과 1로 시작한다는 점을 잊지말자.

    0 과 1 의 입장에서 볼 경우

    if a<0 , return이 재귀호출 종료 함수로도 볼 수 있다.

    def fib (a):
        if a < 2 :
            return a 

    2. 위의 결과를 얻기 위해선 실제적으로 a = 2인 경우 부터 그 전의 두값을 더해가면서부터 시작된다.

    이를 수식으로 정리해보면 좀 더 이해가 쉽다.

    ## n = 값에 따라 반환 값을 정리해보자

    ## 0 일때는 0 반환  / f0

    ## 1  일때는 1 반환   / f1

    ## 2 일때는 1 반환   / f0+ f1 = f2

    ## 3 일때는 2 반환  / f1+ f2 = f3

    ## 4 일때는 3 반환  / f2+ f3 = f4

    ## 5 일때는 5 반환  / f3+ f4 = f5

    # n = a 일때의 반환 값을 f(a) 라 하면 위와 같이 나타낼수 있다.

    ## n = 2 라면 f2 = f(2-1) + f(2-2)

                                  f(1)    +   f(0)

    ## n = 3 라면 f3 = f(3-1) + f(3-2)

                                 f(2)     +  f(1) 

    ## n = 4 라면 f4 = f(4-1) + f(4-2) 

                                 f(3)     +  f(2)

    ## n = 5 라면 f5 = f(5-1) + f(5-2)

                                 f(4)     +  f(3) 

    ## 결국 재귀호출 사용시 바로 앞 두 값의 합을 return해주면 문제 해결이 가능하다.

    def fib (a):
        if a < 2 :
            return a
        return fib(a-2) + fib(a-1)
        
    n = int(input())
    pritn(fib(b))

    ※ 실제 코딩 도장의 해법과 다를  수 있으며, 답은 여러가지가 존재합니다.

    코드 지적 정말 감사히 받겠습니다.

    728x90
    반응형
Designed by Tistory.