본문 바로가기
BASIC

재귀호출

by 자동매매 2023. 11. 21.

1. 함수에서 재귀호출 사용하기

def hello():
    print('Hello, world!')
    hello()
 
hello()

 

Hello, world!
Hello, world!
Hello, world!
...(생략)
Traceback (most recent call last):
  File "C:\project\recursive_function_error.py", line 5, in <module>
    hello()
  File "C:\project\recursive_function_error.py", line 3, in hello
    hello()
  File "C:\project\recursive_function_error.py", line 3, in hello
    hello()
  File "C:\project\recursive_function_error.py", line 3, in hello
    hello()
  [Previous line repeated 974 more times]
  File "C:\project\recursive_function_error.py", line 2, in hello
    print('Hello, world!')
RecursionError: maximum recursion depth exceeded while pickling an object 

 

RecursionError 발생

재귀호출에 종료 조건 만들기

Hello, world! 5
Hello, world! 4
Hello, world! 3
Hello, world! 2
Hello, world! 1
def hello(count):
    if count == 0:    # 종료 조건을 만듦. count가 0이면 다시 hello 함수를 호출하지 않고 끝냄
        return
    
    print('Hello, world!', count)
    
    count -= 1      # count를 1 감소시킨 뒤
    hello(count)    # 다시 hello에 넣음
 
hello(5)    # hello 함수 호출

 

재귀호출로 팩토리얼 구하기

팩토리얼은 1부터 n까지 양의 정수를 차례대로 곱한 값이며 !(느낌표) 기호로 표기합니다.

예를 들어 5!은 5 * 4 * 3 * 2 * 1이며 결과는 120입니다.

def factorial(n):
    if n == 1:      # n이 1일 때
        return 1    # 1을 반환하고 재귀호출을 끝냄
    return n * factorial(n - 1)    # n과 factorial 함수에 n - 1을 넣어서 반환된 값을 곱함
 
print(factorial(5))

 

120

 

회문 구하기

def is_palindrome(word):
    if len(word) < 2:
        return True
    if word[0] != word[-1]:
        return False
    return is_palindrome(word[1:-1])
                                    
 
print(is_palindrome('hello'))
print(is_palindrome('level'))
print(is_palindrome('1111'))

 

fibonach수

0     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17 
0     1     1     2     3     5     8    13    21    34    55    89   144   233   377   610   987  1597

 

def fib(x):
    if x == 0:
        return 0
    elif x == 1:
        return 1
    else:
        return fib(x - 1) + fib(x - 2)


n = int(input())
print(fib(n))

 

 

함수를 변수 또는 리스트에 넣어서 호출할 수 있나요?

함수는 변수에 할당하거나 리스트에 넣어서 호출할 수 있습니다. 단, ( )(괄호)를 붙이지 않고 함수를 그대로 넣어야 합니다. 만약, ()를 붙이면 반환값이 들어갑니다.

def hello():
    print('Hello, world!')
 
x = hello    # 함수를 변수에 할당
x()          # Hello, world!: 변수에 들어있는 함수 호출
 
y = [hello, hello]    # 함수를 리스트에 넣음
y[0]()                # Hello, world!: 리스트에 들어있는 함수 호출
y[1]()                # Hello, world!: 리스트에 들어있는 함수 호출

 

순수 함수와 비순수 함수는 무엇인가요?

순수 함수(pure function)함수의 실행이 외부 상태에 영향을 끼치지 않는 함수를 뜻합니다. 따라서 순수 함수는 부수효과(side effect)가 없어야 하고 입력 값이 같으면 언제나 같은 출력 값을 반환합니다.

def add(a, b):      # 함수 실행이 외부 상태에 영향을 끼치지 않음
    return a + b
 
print(add(1, 2))

 

반대로 비순수 함수(impure function)는 수정자 함수(modifier function)라고도 하는데 함수의 실행이 외부 상태에 영향을 끼치는 함수입니다.

number_list = [1, 2, 3]
 
def append_number(n):        # 함수 실행이 외부 상태에 영향을 끼침
    number_list.append(n)    # 함수 외부에 있는 number_list의 상태가 바뀜
 
append_number(4)

 

'BASIC' 카테고리의 다른 글

클로저  (0) 2023.11.23
람다 표현식(lambda expression)  (1) 2023.11.22
함수  (1) 2023.11.19
Exception  (0) 2023.11.19
덕타이핑 / 믹스인  (1) 2023.11.19

댓글