알고리즘

[Python&SQL] 재귀 함수 팩토리얼 구구단

LeeSeunghyuk 2021. 1. 3. 12:27
반응형

안녕하세요

 

오늘은 파이썬 코드와 오라클 SQL 쿼리를 사용해

팩토리얼을 구현해 보도록 하겠습니다.

 

또, 재귀 함수에 대해 알아보고

재귀 함수를 사용해 팩토리얼을 구현하도록 하겠습니다.

 

 

### 재귀(Recursive) , 재귀 함수(recursive function) ?

 

어떤 사건이 자기 자신을 포함하고 다시 자기 자신을 사용하여 정의될 때 재귀적(recursive)이라고 합니다.

 

즉, 재귀 함수는 자기 자신을 다시 호출해 작업하는 함수입니다.

 

## 계승(factorial) ? 

 

1부터 n개의 양의 정수를 모두 곱한 것을 n계승(팩토리얼)이라고 합니다.

n 팩토리얼은 n!로 나타낼 수 있습니다.

 

## 로그의 성질

 

다음 로그의 성질을 사용해서 오늘 코드를 구현할 것입니다.

 

1. 밑이 같은 로그의 합은 진수의 곱으로 나타낼 수 있습니다.

2. 로그의 밑을 로그 거듭제곱하면 진수가 됩니다.

 

출처 : https://terms.naver.com/entry.nhn?docId=3350178&cid=60210&categoryId=60210

 

### 팩토리얼 구현 방법

 

##  로그의 성질 이용

 

# 알고리즘의 순서는 다음과 같습니다.

 

① 팩토리얼 수 입력 or 정의합니다.

② 밑이 같은 로그를 사용합니다.

③ 로그의 진수를 1부터 주어진 수까지 두어 합을 계산합니다. <- 1번 성질

④ 밑과 같은 수의 거듭 제곱을 사용해 진수를 계산합니다. <- 2번 성질

 

##  재귀 함수 이용

 

# 알고리즘의 순서는 다음과 같습니다.

 

① 팩토리얼 수 입력 or 정의합니다.

② 입력 받은 수가 1인지 확인, 아니라면 입력 받은 수를 -1로 변경합니다.

③ 수-1 인자를 사용해 자기 자신을 다시 호출해야 합니다.

④ 이때 return은 입력받은 수 * 함수(수-1) 값을 사용해 호출합니다.

⑤ 수가 1인지 확인하고, 맞다면 1을 return합니다.

 

 

### Python 팩토리얼, 재귀함수 구현하기

 

##  로그의 성질

import math

num=5
a=10
res=0

for i in range(1,num+1):
    res += math.log(i,a)

print(round(pow(a,res)))

 

5!을 구하는 코드입니다.

밑(a)는 10으로 사용합니다.

res 변수는 log10 1 + log10 2 .... + log 10 5의 결과를 갖습니다.

res 변수는 로그 성질에 의해 다음과 결과가 같습니다.

log10(1x2x3x4x5) 

 

pow 함수를 사용해 10의 res승을 구하면 5!의 결과를 확인할 수 있습니다.

 

##  팩토리얼

def recur_factorial(num):
    if num==1:
        return 1
    else:
        return num*recur_factorial(num-1)
    
print(recur_factorial(5))

f = recur_factorial

f(5)는 num != 1

5 * f(4) 리턴합니다

 

이때 f(4)가 호출되어 함수 실행됩니다.

f(4)는 num !=1

4 * f(3) 리턴합니다.

 

f(1) 까지 계속진행합니다.

f(1)은 1을 리턴합니다.

 

마지막으로 결과를 확인합니다.

 

재귀함수 구구단 )

def mul_tab(num,a=9):
    if a==1:
        return print('%s x %s = %s'%(num,a,num*a))
    else:  
        mul_tab(num,a-1)
        return print('%s x %s = %s'%(num,a,num*a))
    
mul_tab(5)

재귀 함수에서는 함수의 실행 자체가 마지막에 호출된 함수부터 수행되는것을 알 수 있습니다.

출력된 순서(return)을 확인하면 1부터 출력이 됩니다.

그 말은 가장 재귀의 끝(mul_tab(1)) 부터 차례로 mul_tab(9) 까지의 결과가

순차적으로 출력되고 있습니다.

 

리턴 값으로 들어가기 전에 자기 자신의 함수가 다시 호출되어서 그렇습니다.

 

### SQL 팩토리얼 구하기

 

 

accept num prompt '숫자를 입력하세요:'
		with fac_table as (select trunc(power(exp(1),sum(ln(level))))as factorial
		                    from dual
		                    connect by level<= &&num)
select &&num||'(!)팩토리얼은 '|| factorial || ' 입니다.' as factorial
from fac_table;

 

지수의 성질을 이용했습니다.

ln 함수를 사용해서 입력 받은 수까지의 합을 구합니다.

power함수와 exp를 사용해 결과를 확인할 수 있습니다.

 

 

오늘은 재귀함수를 사용해서 팩토리얼을 구현해 보았습니다.

 

읽어주셔서 감사합니다.

 

 

반응형