본문 바로가기
Python/닭치고 Algorithm

5강 재귀호출 팩토리얼(Python Algorithm 5 Factorial)

by OneHundredPlan 2020. 3. 1.
반응형

5강 재귀호출 팩토리얼(Python Algorithm 5 Factorial)

부제 : 알고리즘을 배우면서 파이썬 기초부터 RPG까지 정복

내용 : 초중고 또는 코딩 기초 입문자를 위한 누구나 따라 배울 수 있는 Python Algorithm 프로그램 기초 강의

파이썬을 통해 알고리즘도 배우고 기초 프로그램 문법도 배우고 수학도 배우면서 기초 코딩 교육을 배웁시다. 초보자도 아주 쉽게 배울 수 있도록 최대한 쉽게 설명을 할 것이며 따라하다 보면 어느덧 기초 과정을 마스터하면서 나중에 TRPG(Table-talk Role Playing Game 이라고 하는데 저는 그냥 Text Role Playing Game 즉 문자 타이핑으로 하는 역할 수행 게임 이라고 부르겠습니다.)를 구현하는 과정까지 해 보겠습니다. 교재 및 강의 자료는 네이퍼 카페 백년지계 에 파이썬 에서 닭치고 알고리즘 부분에도 있습니다. 이 시대의 패러다임 코딩 교육을 쉽게 접근하여 친밀한 생활의 코딩으로 배워 나갑시다. 함께 닭치고 아두이노도 같이 하시면 좋습니다.

구독 좋아요 댓글 많이 많이 해주세요.

[동영상강의]

https://youtu.be/HgP__esEa38

Python-Algorithm-5-재귀호출-팩토리얼.pdf
0.66MB

5. 재귀호출-팩토리얼(factorial)

Microsoft Visual Studio 사용법

이제부터 코딩은 Microsoft Visual Studio를 사용합시다.

Microsoft Visual Studio 를 실행합니다.

파일 > 새로만들기 > 파일로 갑니다.

재귀호출(Recursive call)

재귀호출(Recursive call)은 함수가 자기 자신을 다시 호출하는 것을 말합니다.

알고리즘을 배우는데 매우 중요한 알고리즘이므로 자세히 배우도록 해서 꼭 정복하도록 합시다.

팩토리얼(factorial)


팩토리얼(factorial)이란 1부터 n 까지 연속한 정수의 곱을 말합니다. 

고등학교 수학에서 배우지만 그렇게 어렵지 않으므로 수학도 배우면서 알고리즘도 배우도록 합시다. 

중학교 때 확률 부분에서 5명이 5줄을 설 수 있는 방법을 구할 때 앞줄에 5명 중에 5명을 택해서 줄 세울 수 있으므로 맨 앞줄 5가지가 생길 수 있고 2째줄에서는 앞줄에 한명이 섰으므로 4명 남은 사람 중에서 택해서 줄 세울 수 있으므로 4가지 경우가 있고 이렇게 해서 줄 세우는 경우의 수는 $ 5 \times 4  \times 3  \times 2  \times 1 $이런식으로 배운 것이 기억이 날 것입니다.

 $ 5 \times 4  \times 3  \times 2  \times 1 $ 을 5! (! : factorial 뜻, 5 팩토리얼 하고 읽습니다.)로 표기합니다.

$0! =1$    (0 팩토리얼은 그냥 외우세요.) 

$1! = 1$

$2! = 2 \times 1$

$3! = 3 \times 2 \times 1 = 6$

$4! = 4 \times 3 \times 2 \times 1 = 24$

 $ 5 \times 4  \times 3  \times 2  \times 1 =120$

$\cdots$

$n! = n \times (n-1) \times (n-2) \times (n-3) \times \cdots \times 4 \times 3 \times 2 \times 1$



Microsoft Visual Studio 사용법

이제부터 코딩은 Microsoft Visual Studio를 사용합시다.

Microsoft Visual Studio 를 실행합니다.

파일 > 새로만들기 > 파일로 갑니다.






python > 빈모듈 을 선택하시고 우측 하단에 있는 열기를 클릭합니다. 

 



기본적으로 모듈2.py 가 열렸습니다. 



우리가 작성할 RecursiveFactorial.py 로 저장하도록 합시다. 

파일 > 다른 이름으로 선택한 항목 저장 을 클릭합니다. 




자신이 만들어 놓은 폴더에 저장합니다. 

파일명이 RecursiveFactorial.py 로 변경된 것을 볼 수 있습니다. 



그렇게 어렵지 않죠? 사용하면 편안해집니다. 



팩토리얼 구현하기

자 이제 본격적으로 코딩을 해 봅시다.

 




def recur_fact(n) 으로 함수명을 정한 다음 함수 안에 들어갈 내용들은 Tab 키로 한번 눌러서 공간을 띄웁니다.

파이썬에서는 이렇게 공간띄우기로 줄을 맞추는 것이 매우 중요합니다. 

for 문 안에 있는 f=f*i 는 Tab 키 두번 누른 공간입니다. 



RecursiveFactorial.py 는 아직 재귀호출을 하지 않은 코딩입니다.

이번 강의가 재귀호출이라 그냥 파일명을 Recursive 라고 붙인 겁니다. 

이번 다음 코딩에서 재귀호출 알고리즘을 이용할 것입니다. 



RecursiveFactorial.py

 

# 1부터 n 까지 연속한 정수의 곱 구하기
# 입력 : n
# 출력 : 1부터 n 까지 연속한 숫자를 곱한 결과 값

def recur_fact(n): 
    f = 1  # 곱을 계산할 변수에 초깃값을 1로 세팅합니다. 
    for i in range(1, n+1) : # 1부터 n까지 반복 (n+1)은 제외
        f = f * i  
    return f

print(recur_fact(0))   # 0! =1
print(recur_fact(6))   # 6! = 720
print(recur_fact(10))  # 10! = 3628800

 

C:\python>python RecursiveFactorial.py 

1 
720 
3628800 


for in 문

for문의 기본적인 구조는 다음과 같습니다.

 

for 변수 in 반복가능한 객체: # 반복가능한 객체로 리스트, 튜플 같은 것을 말하는데
                          # 우리는 range 를 사용하겠습니다. 
    수행할 문장1
    수행할 문장2
    ...


반복가능한 객체로 range 를 사용하게 되면  첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 "수행할 문장1", "수행할 문장2" 등이 수행됩니다. 


항상 프로그래밍 입문할 때 Hello, world! 를 출력하는 것으로 시작을 하는데 10번 출력하는 것을 코딩해 봅시다. 

# print 10번 사용
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')
print('Hello, world!')



이것이 100번 , 1000 번 반복한다면 무척 귀찮겠죠.

이때 for in 을 사용합니다. 



IDLE 사용

 

참...간단한 코딩은 IDLE 를 사용합시다.

 









Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> print("Hello, World")
Hello, World
>>> print("Hello, world!") #쌍따옴표 사용해도 되고
Hello, world!
>>> print('Hello, world!') #따옴표 한개 사용해도 됩니다. 
Hello, world!
>>> 



>>>for i in range(10): # range(10) 숫자 0부터 9까지 생성하면서 차례로 하나씩 꺼내어 i 에 대입
                    # 엔터키 치시고 
    print('Hello, world!') # 엔터키 치시고 
                           # 한번 더 엔터키 칩니다. 
	
Hello,world!
Hello,world!
Hello,world!
Hello,world!
Hello,world!
Hello,world!
Hello,world!
Hello,world!
Hello,world!
Hello,world!
>>>     


range(10) : 숫자 0부터 9까지 생성합니다.

  • 생성된 0부터 9까지 숫자에서 하나씩 꺼내어 i 에 대입합니다.

  • 숫자를 하나씩 꺼낼 때마다 print('Hello, world!') 를 실행합니다.



이제 이렇게 간단한 코딩 for i in range(10): print('Hello, world!') 은 외울 정도가 되었을 겁니다. 

어느 공부든지 외우는 것은 중요합니다. 

이제 IDLE 에서 소스 파일을 만들어 봅시다. 


File > New File 을 합니다.





내용이 비어 있는 소스 코드 편집창이 나옵니다.  



다음 내용을 소스 코드 편집 창에 입력하세요.




입력한 파이썬 코드를 실행하려면 .py 파일에 저장해야 합니다. 소스 코드 편집 창의 메뉴에서 File > Save를 클릭하거나 Ctrl+S를 누릅니다.




HelloWorld 라고 하면 파일 형식은 자동으로 py 가 붙어서 HelloWorld.py 가 만들어 집니다. 

 




이제 소스 코드 편집 창의 메뉴에서 Run > Run Module을 클릭하거나 F5 키를 누르면 IDLE의 파이썬 셸 창에 Hello, world!가 출력됩니다.




이렇게 IDLE의 소스 코드 편집 창에 내용을 입력한 뒤 실행하면 파이썬 셸 창에 결과가 출력됩니다. 

이렇게 파이썬 코드를 저장한 .py 파일을 파이썬 스크립트(Python script)라고 부릅니다.



shell 을 그만 두고 싶을 때는 exit() 를 적으시면 됩니다. 



[확인] 을 클릭하세요. 

 

>>>exit() 



저장한 HelloWorld.py 를 열어서 사용하고 싶을 때는 File > Open 을 해서 여시면 됩니다. 

 




중간 타임으로 IDLE 사용법을 설명하였습니다. 코딩을 공부하시다가 간단한 코딩들은 IDLE 을 열어서 확인을 해 가면서 공부를 하면 좋습니다. 


이제 우리가 작성한 프로그램 호출 순서를 생각해 봅시다.

def recur_fact(n): 
    f = 1  # 곱을 계산할 변수에 초깃값을 1로 세팅합니다. 
    for i in range(1, n+1) : # 1부터 n까지 반복 (n+1)은 제외
        f = f * i  
    return f

print(recur_fact(0))   # 0! =1
print(recur_fact(6))   # 6! = 720
print(recur_fact(10))  # 10! = 3628800

 

print(recur_fact(6))


에서 recur_fact(n) 함수를 불러내어서 n에 6을 대입합니다.  

def recur_fact(6): 


f=1 로 해서 f의 값을 1로 초기세팅을 합니다. 

range(1, n+1)  에 가서 n에 6을 대입하면

 

range(1, 7) # 1, 2, 3, 4, 5, 6 숫자를 생성합니다. 


range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 숫자를 앞에서 부터 하나씩 꺼내어 for i  에 있는 i 에 하나씩 대입을 합니다. 

1을 먼저 꺼내므로 i=1 이 됩니다. 

f = f * i  로 가서 현재 f=1, i = 1 이므로 f = 1 * 1 = 1 이 됩니다. 

 

f = f * i  #  f = 1 * 1 = 1


이제 f=1 이 됩니다. 

range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 숫자 2를 꺼냅니다. 

i=2 가 됩니다. 

f = f * i  로 가서 현재 f=1, i = 2 이므로 f = 1 * 2 = 2 가 됩니다.  

이제 f = 2 가 되는 것입니다. 

range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 숫자 3을 꺼냅니다. 

i=3 이 됩니다. 

f = f * i  로 가서 현재 f=2, i = 3 이므로 f = 2 * 3 = 6 이 됩니다. 

이제 f=6 이 됩니다. 

range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 숫자 4를 꺼냅니다. 

i=4 가 됩니다. 

f = f * i  로 가서 현재 f=6, i = 4 이므로 f = 6 * 4 = 24 가 됩니다. 

이제 f=24 이 됩니다. 

range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 숫자 5를 꺼냅니다. 

i=5 가 됩니다. 

f = f * i  로 가서 현재 f=24, i = 5 이므로 f = 24 * 5 = 120 이 됩니다. 

이제 f=120 이 됩니다. 

range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 숫자 6을 꺼냅니다. 

i=6 이 됩니다. 

f = f * i  로 가서 현재 f=120, i = 6 이므로 f = 120 * 6 = 720 이 됩니다. 

range(1, 7) 에서 생성한 1, 2, 3, 4, 5, 6 을 다 불러냈으므로 return f 로 갑니다. 

 

return f # f = 720



f = 720 의 값을 recur_fact(6) 에 대입하여 print(recur_fact(6)) 에서 720 이 출력되게 합니다. 


이번 강의는 재귀호출을 배우는 부분이므로 RecursiveFactorial.py 는 아직 재귀호출을 구현하지 않았으므로 코딩 해석은 1강 sum.py 를 이해하신 분들은 직감적으로 이해를 하실 것입니다. 












댓글