안녕하세요
오늘은 파이썬 코드와 오라클 SQL 쿼리를 사용해
팩토리얼을 구현해 보도록 하겠습니다.
또, 재귀 함수에 대해 알아보고
재귀 함수를 사용해 팩토리얼을 구현하도록 하겠습니다.
### 재귀(Recursive) , 재귀 함수(recursive function) ?
어떤 사건이 자기 자신을 포함하고 다시 자기 자신을 사용하여 정의될 때 재귀적(recursive)이라고 합니다.
즉, 재귀 함수는 자기 자신을 다시 호출해 작업하는 함수입니다.
## 계승(factorial) ?
1부터 n개의 양의 정수를 모두 곱한 것을 n계승(팩토리얼)이라고 합니다.
n 팩토리얼은 n!로 나타낼 수 있습니다.
## 로그의 성질
다음 로그의 성질을 사용해서 오늘 코드를 구현할 것입니다.
1. 밑이 같은 로그의 합은 진수의 곱으로 나타낼 수 있습니다.
2. 로그의 밑을 로그 거듭제곱하면 진수가 됩니다.
### 팩토리얼 구현 방법
## 로그의 성질 이용
# 알고리즘의 순서는 다음과 같습니다.
① 팩토리얼 수 입력 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를 사용해 결과를 확인할 수 있습니다.
오늘은 재귀함수를 사용해서 팩토리얼을 구현해 보았습니다.
읽어주셔서 감사합니다.
'알고리즘' 카테고리의 다른 글
[Python & SQL] 몬테 카를로 | 원주율 구하기 (1) | 2021.01.09 |
---|---|
[Python] 없는 수가 뭘까 ? 빠진수 찾기 (6) | 2021.01.07 |
[Python] 주사위 던지기 (2) | 2021.01.05 |
[Python&SQL] 동전의 앞면이 나올 확률은 ? Random (0) | 2021.01.04 |
[Python] 소인수 분해하기 (2) | 2021.01.02 |
[Python] 최소공배수(LCM) 구하기 (0) | 2021.01.02 |
[Python & SQL ] 최대 공약수 구하기 (0) | 2020.12.31 |
[Python & SQL] 정수 소수 판별기 (2) | 2020.12.30 |