SlideShare a Scribd company logo
빅데이터 자료구조
 순환 (또는 재귀) 알고리즘이란?
 양쪽에 거울이 있을 때 거울에 비친 자신이 무한 반복해서 비치는 것처럼 동일한 작동을 무한
적으로 반복하는 알고리즘을 말함
 순환(재귀) 호출의 개념
 순환 또는 재귀 호출(Recursion)은 자신을 다시 호출하는 것
마지막 종이 상자가 나올 때까지 여러 개 겹쳐진 상자를 꺼내 마지막 상자에 반지 넣는 예
꺼낸 순서와 반대로 종이 상자를 다시 넣는 예
 순환 호출의 작동
 상자를 반복해서 여는 과정을 순환(재귀) 호출 형태로 표현
 팩토리얼 값 구하기
 피보나치 수열 구하기
 이항계수 구하기
 하노이 타워 게임
 이진탐색 수행
 영역채색 (Blob Coloring)
`
1
0
)!
1
(
*
1
!

=



−
=
n
n
n
n
n
n)
k
otherwise(
n
k
or
k
C
C
C
k
n
k
n
k
n


=
=



+
=
−
−
− 0
0
1
1
1
1





−
+
−
=
=
=
otherwise
n
fib
n
fib
n
if
n
if
n
fib
)
1
(
)
2
(
1
1
0
0
)
(
 순환 호출의 작동
 상자를 반복해서 여는 과정을 순환(재귀) 호출 형태로 표현
 팩토리얼의 정의
 팩토리얼 프로그래밍 #1:
 정의에 따라 그대로 구현
 (n-1)! 을 구하는 서브 함수 recur_factorial(n-1)를 호출
1
0
)!
1
(
*
1
!

=



−
=
n
n
n
n
n
 팩토리얼 함수의 호출 순서
factorial(3) = 3 * factorial(2)
= 3 * 2 * factorial(1)
= 3 * 2 * 1
= 3 * 2
= 6
factorial(2)
{
if( 2 == 1 ) return 1;
else return (2 * factorial(2-1) );
}
factorial(1)
{
if( 1 == 1 ) return 1;
.....
}
①
②
③
④
factorial(3)
{
if( 3 == 1 ) return 1;
else return (3 * factorial(3-1) );
}
 순환 알고리즘은 다음과 같은 부분들을 포함한다.
 순환 호출을 하는 부분
 순환 호출을 멈추는 부분
순환 프로그램의 구조
 일반적인 프로그램에서는 무한 반복을 마치고 되돌아가는 조건을 함께 사용함
10회 반복 후 호출한 곳으로 다시 돌아가는 조건을 사용하는 예
빅데이터 자료구조
빅데이터자료구조 Python Module Recursion -모듈-순환-최종.pdf
7행의 return 문을 만나면 어디로 돌아가는가(함수의 재귀 호출 방식 이해)
 숫자 합계 내기(1부터 10까지 합계를 구하는 예)
 반복문을 이용한 구현
 재귀 함수를 이용한 구현
↓ 5부터 1까지 합계로 단순화
 팩토리얼 구하기(10부터 1까지 곱하는 예)
 반복문을 이용한 구현
 재귀 함수를 이용한 구현
반복문을 순환문으로 변환
 5!을 재귀 호출로 구현한 코드의 단계별 작동 과정
 A부분에서 11행의 factorial(5)를 호출
 ~ num이 5, 4, 3, 2인 상태에서 A 부분의 5~6행 실행(순환 함수 1~4회 호출)
1
2 5
 num이 1인 상태에서 A 부분의 2~4행을 실행하여 1 반환(재귀 함수 5회 호출)
 반환된 ~ num이 2, 3, 4, 5인 상태에서 B 부분의 8~9행 실행
6
5 2
 반환된 처음 호출한 factorial(5)가 반환되어 최종 5!인 120 출력
1
 우주선 발사 카운트다운
 우주선 발사를 위해 카운트하는 코드
 별 모양 출력하기
 입력한 숫자만큼 차례대로 별 모양을 출력하는 코드
 구구단 출력하기
 2단부터 9단까지 구구단을 출력하는 코드
 N제곱 계산하기
 N제곱을 계산하는 코드
 N제곱 계산하기
 순환적인 호출
power(x, n)
if n = 0
then return 1;
else if n이 짝수
then return power(x2, n/2);
else if n이 홀수
then return x*power(x2, (n-1)/2);
power(2,10)
10이 짝수이므로 ➔ power( )
return 1024;
power(4,5)
5가 홀수이므로 ➔ 4*power( )
return 4 * 256;
power(16,2)
2이 짝수이므로 ➔ power( )
return 256;
power(256,1)
1이 홀수이므로 ➔ 256*power( )
return 256 * 1;
power(65536,0)
return 1;
 N제곱 계산하기
 N제곱 계산하기
 순환적인 방법의 시간 복잡도
 n이 2의 제곱이라면 문제의 크기가 절반씩 줄어든다.
 시간 복잡도
 순환적인 함수: O(log2n) -> 반복문을 적용한 경우에 비해 매우 빠른 성능을 보임
 반복적인 함수: O(n)
0
1
2
1
2
2
2
2
2 →
→
→
→ −

n
n
순환 함수 1억 회 호출
반복 함수 1억 회 호출
 배열의 합 계산하기
 랜덤하게 생성한 배열의 합계를 구하는 코드
 피보나치 수: 0,1,1,2,3,5,8,13,21,…





−
+
−
=
=
otherwise
n
fib
n
fib
n
n
n
fib
)
1
(
)
2
(
1
1
0
0
)
(
 순환적인 피보나치의 비효율성
 같은 항이 중복해서 계산되어, 순환프로그램의 비효율성을 초래
 n이 커지면 더욱 심각해짐
fib(2)
fib(1)
fib(0)
fib(1)
fib(1)
fib(0)
fib(3)
fib(2)
fib(4)
fib(2)
fib(1)
fib(0)
fib(1)
fib(3)
fib(2)
fib(1)
fib(0)
fib(1)
fib(1)
fib(0)
fib(3)
fib(2)
fib(4)
fib(5)
fib(6)
 대칭문자열(회문) 판단하기
 대칭문자열인 회문(Palindrome)은 앞에서부터 읽든 뒤에서부터 읽든 동일한 단어나 문장을
의미
회문 예
빅데이터자료구조 Python Module Recursion -모듈-순환-최종.pdf
 프랙탈 그리기
 프랙탈(Fractal)은 작은 조각이 전체와 비슷한 기하학적인 형태를 의미(자기 유사성)
 자기 유사성(Self Similarity)은 부분을 확대하면 전체와 동일한 또는 닮은 꼴의 모습을 나타
내는 성질이 있음
1000×1000 크기의 윈도 창을 만들고 중앙에 반지름 400 크기의 원을 그리는 코드
 원 도형의 간단한 프랙탈 그리기
하나의 원 안에 작은 원을 2개 좌우로 그리는 것을 재귀 호출로 반복
 원 도형의 전체 프랙탈 그리기
def openBox() :
global count
print("종이 상자를 엽니다. ^^")
count -= 1
if count == 0 :
print("** 반지를 넣고 반환합니다. **")
return
openBox()
print("종이 상자를 닫습니다. ^^")
count = 10
openBox() # 처음 함수를 다시 호출
 실행결과
Code 10-2
def addNumber(num) :
if num <= 1 :
return 1
return num + addNumber(num-1)
print(addNumber(10))
 실행결과
Code 10-3
def factorial(num) :
if num <= 1 :
print('1 반환')
return 1
print("%d * %d! 호출" % (num, num-1))
retVal = factorial(num-1)
print("%d * %d!(=%d) 반환" % (num, num-1, retVal))
return num * retVal
print('n5! = ', factorial(5))
Code 10-4
• 실행결과
def countDown(n) :
if n == 0 :
print('발사!!')
else :
print(n)
countDown(n-1)
countDown(5)
Code 10-5
• 실행결과
def printStar(n) :
if n > 0 :
printStar(n-1)
print('★' * n)
printStar(5)
Code 10-6
• 실행결과
def gugu(dan, num) :
print("%d x %d = %d" % (dan, num, dan*num))
if num < 9:
gugu(dan, num+1)
for dan in range(2,10) :
print("## %d단 ##" % dan)
gugu(dan, 1)
Code 10-7
• 실행결과
tab = ''
def pow(x, n) :
global tab
tab += ' '
if n == 0 :
return 1
print(tab+"%d*%d^(%d-%d)" % (x, x, n, 1))
return x * pow (x, n-1)
print('2^4')
print('답 -->', pow(2, 4))
Code 10-8
• 실행결과
import random
def arySum(arr, n) :
if n <= 0 :
return arr[0]
return arySum(arr, n-1) + arr[n]
ary = [random.randint(0, 255) for _ in range(random.randint(10, 20))]
print(ary)
print('배열 합계 -->', arySum(ary, len(ary)-1))
Code 10-9
• 실행결과
def fibo(n) :
if n == 0 :
return 0
elif n == 1 :
return 1
else :
return fibo(n-1) + fibo(n-2)
print('피보나치 수 --> 0 1 ', end='')
for i in range(2, 20) :
print(fibo(i), end=' ')
Code 10-10
• 실행결과
## 함수 선언 부분 ##
def palindrome(pStr) :
if len(pStr) <= 1 :
return True
if pStr[0] != pStr[-1] :
return False
return palindrome(pStr[1:len(pStr)-1])
## 전역 변수 선언 부분 ##
strAry = ["reaver", "kayak", "Borrow or rob", "주유소의 소유주", "야 너 이번주 주번이 너야", "살금 살금"]
## 메인 코드 부분 ##
for testStr in strAry :
print(testStr, end = '--> ' )
testStr = testStr.lower().replace(' ','')
if palindrome(testStr) :
print('O')
else :
print('X')
Code 10-11
• 실행결과
from tkinter import *
window = Tk()
canvas = Canvas(window, height=1000, width=1000, bg='white')
canvas.pack()
cx=1000//2
cy=1000//2
r = 400
canvas.create_oval(cx-r, cy-r, cx+r, cy+r, width=2, outline="red")
window.mainloop()
Code 10-12
• 실행결과
from tkinter import *
## 함수 선언 부분 ##
def drawCircle(x, y, r) :
global count
count += 1
canvas.create_oval(x-r, y-r, x+r, y+r)
canvas.create_text(x, y-r, text=str(count), font=('', 30))
if r >= radius/2 :
drawCircle(x-r//2, y, r//2)
drawCircle(x+r//2, y, r//2)
## 전역 변수 선언 부분 ##
count = 0
wSize = 1000
radius = 400
## 메인 코드 부분 ##
window = Tk()
canvas = Canvas(window, height=wSize, width=wSize, bg='white')
drawCircle(wSize//2, wSize//2, radius)
canvas.pack()
window.mainloop()
Code 10-13
• 실행결과
from tkinter import *
import random
## 함수 선언 부분 ##
def drawCircle(x, y, r) :
canvas.create_oval(x-r, y-r, x+r, y+r, width=2, outline=random.choice(colors))
if r >= 5 :
drawCircle(x+r//2, y, r//2)
drawCircle(x-r//2, y, r//2)
## 전역 변수 선언 부분 ##
colors = ["red", "green", "blue", "black", "orange", "indigo", "violet"]
wSize = 1000
radius = 400
## 메인 코드 부분 ##
window = Tk()
window.title("원 모양의 프랙탈")
canvas = Canvas(window, height=wSize, width=wSize, bg='white')
drawCircle(wSize//2, wSize//2, radius)
canvas.pack()
window.mainloop()
Code 10-14
• 실행결과
## 함수 선언 부분 ##
def notation(base, n):
if n < base :
print(numberChar[n], end = ' ')
else :
notation(base, n // base)
print(numberChar[n % base], end = ' ')
## 전역 변수 선언 부분 ##
numberChar = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
numberChar += ['A', 'B', 'C', 'D', 'E', 'F']
## 메인 코드 부분 ##
number = int(input('10진수 입력 -->'))
print('n 2진수 : ', end = ' ')
notation(2, number)
print('n 8진수 : ', end = ' ')
notation(8, number)
print('n16진수 : ', end = ' ')
notation(16, number)
EX 10-1
• 실행결과
from tkinter import *
## 함수 선언 부분 ##
def drawTriangle(x, y, size) :
if size >= 30 :
drawTriangle(x, y, size/2)
# 왼쪽 아래 작은 삼각형
drawTriangle(x+size/2, y, size / 2)
# 오른쪽 아래 작은 삼각형
drawTriangle(x + size / 4, int(y-size*(3**0.5)/4), size / 2)
# 위쪽 작은 삼각형
else :
canvas.create_polygon (x, y, x + size, y, x + size / 2, y - size*(3
** 0.5) / 2, fill = 'red', outline = "red")
## 전역 변수 선언 부분 ##
wSize = 1000
radius = 400
## 메인 코드 부분 ##
window = Tk()
window.title("삼각형 모양의 프랙탈")
canvas = Canvas(window, height = wSize, width = wSize, bg = 'white')
drawTriangle(wSize/5, wSize/5*4, wSize*2/3)
canvas.pack()
window.mainloop()
EX 10-2
• 실행결과
def addNumber(num1, num2) :
if num2 <= num1 :
return num1
return num2 + addNumber( num1, num2 - 1 )
num1 = int(input('숫자1-->'))
num2 = int(input('숫자2-->'))
if num1 > num2 :
num1, num2 = num2, num1
print(addNumber(num1, num2))
 실행결과
Self 10-1
def gugu(dan, num) :
print("%dx%d=%2d" % (dan, num, dan*num), end = ' ')
if dan < 9:
gugu(dan+1, num)
for num in range(1,10) :
gugu(2, num)
print()
Self 10-2
 실행결과

More Related Content

PDF
제3장 계산방법에대한 파이썬학습진행방법. 계산을 통해 python programing
PPTX
Doing math with python.ch06
PPT
Equation Solving
PDF
Backtracking [ICPC Sinchon]
PPTX
하스켈로 알고리즘 문제 풀기
PDF
[Algorithm] Recursive(재귀)
PDF
자료구조01
PDF
자료구조01
제3장 계산방법에대한 파이썬학습진행방법. 계산을 통해 python programing
Doing math with python.ch06
Equation Solving
Backtracking [ICPC Sinchon]
하스켈로 알고리즘 문제 풀기
[Algorithm] Recursive(재귀)
자료구조01
자료구조01

Similar to 빅데이터자료구조 Python Module Recursion -모듈-순환-최종.pdf (20)

PDF
자료구조01
PPTX
하스켈 성능 튜닝
PPTX
코딩테스트 합격자 되기 C++ 15장 동적계획법에 대한 강의자료 입니다.
PDF
2012 Ds 01
PDF
서울대학교 2017 SNUPC 문제 - Advanced
PDF
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
PDF
Coursera Machine Learning으로 기계학습 배우기 : week2
PDF
2012 Ds B1 01
PDF
알고리즘과 자료구조
PDF
[SHAKE] 경인지역 6개연합 프로그래밍 경시대회 - 예선문제(아주대)
PDF
KAIST RUN 교내 ACM-ICPC 모의대회 Advanced division 문제
PDF
HI-ARC Number Theory
PPTX
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
PDF
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
PDF
자료구조02
PDF
2012 Dm A0 06 Pdf
PDF
2012 Dm A0 06 Pdf
PPTX
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
DOCX
자료구조 Project1
PDF
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
자료구조01
하스켈 성능 튜닝
코딩테스트 합격자 되기 C++ 15장 동적계획법에 대한 강의자료 입니다.
2012 Ds 01
서울대학교 2017 SNUPC 문제 - Advanced
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제
Coursera Machine Learning으로 기계학습 배우기 : week2
2012 Ds B1 01
알고리즘과 자료구조
[SHAKE] 경인지역 6개연합 프로그래밍 경시대회 - 예선문제(아주대)
KAIST RUN 교내 ACM-ICPC 모의대회 Advanced division 문제
HI-ARC Number Theory
코딩테스트 합격자 되기 C++ 00~ 01장(효율적 공부하는방법).pptx
[D2 CAMPUS] 부산대 Alcall 프로그래밍 경시대회 문제
자료구조02
2012 Dm A0 06 Pdf
2012 Dm A0 06 Pdf
코딩 테스트 합격자 되기 C++ 00장~ 01장을 정리한 강의자료 입니다.
자료구조 Project1
알고리즘 연합캠프 세미나 1-C (알고리즘 설계와 모델링 및 수학)
Ad

빅데이터자료구조 Python Module Recursion -모듈-순환-최종.pdf

  • 2.  순환 (또는 재귀) 알고리즘이란?  양쪽에 거울이 있을 때 거울에 비친 자신이 무한 반복해서 비치는 것처럼 동일한 작동을 무한 적으로 반복하는 알고리즘을 말함
  • 3.  순환(재귀) 호출의 개념  순환 또는 재귀 호출(Recursion)은 자신을 다시 호출하는 것 마지막 종이 상자가 나올 때까지 여러 개 겹쳐진 상자를 꺼내 마지막 상자에 반지 넣는 예 꺼낸 순서와 반대로 종이 상자를 다시 넣는 예
  • 4.  순환 호출의 작동  상자를 반복해서 여는 과정을 순환(재귀) 호출 형태로 표현
  • 5.  팩토리얼 값 구하기  피보나치 수열 구하기  이항계수 구하기  하노이 타워 게임  이진탐색 수행  영역채색 (Blob Coloring) ` 1 0 )! 1 ( * 1 !  =    − = n n n n n n) k otherwise( n k or k C C C k n k n k n   = =    + = − − − 0 0 1 1 1 1      − + − = = = otherwise n fib n fib n if n if n fib ) 1 ( ) 2 ( 1 1 0 0 ) (
  • 6.  순환 호출의 작동  상자를 반복해서 여는 과정을 순환(재귀) 호출 형태로 표현
  • 7.  팩토리얼의 정의  팩토리얼 프로그래밍 #1:  정의에 따라 그대로 구현  (n-1)! 을 구하는 서브 함수 recur_factorial(n-1)를 호출 1 0 )! 1 ( * 1 !  =    − = n n n n n
  • 8.  팩토리얼 함수의 호출 순서 factorial(3) = 3 * factorial(2) = 3 * 2 * factorial(1) = 3 * 2 * 1 = 3 * 2 = 6 factorial(2) { if( 2 == 1 ) return 1; else return (2 * factorial(2-1) ); } factorial(1) { if( 1 == 1 ) return 1; ..... } ① ② ③ ④ factorial(3) { if( 3 == 1 ) return 1; else return (3 * factorial(3-1) ); }
  • 9.  순환 알고리즘은 다음과 같은 부분들을 포함한다.  순환 호출을 하는 부분  순환 호출을 멈추는 부분
  • 10. 순환 프로그램의 구조  일반적인 프로그램에서는 무한 반복을 마치고 되돌아가는 조건을 함께 사용함 10회 반복 후 호출한 곳으로 다시 돌아가는 조건을 사용하는 예
  • 13. 7행의 return 문을 만나면 어디로 돌아가는가(함수의 재귀 호출 방식 이해)
  • 14.  숫자 합계 내기(1부터 10까지 합계를 구하는 예)  반복문을 이용한 구현  재귀 함수를 이용한 구현
  • 15. ↓ 5부터 1까지 합계로 단순화
  • 16.  팩토리얼 구하기(10부터 1까지 곱하는 예)  반복문을 이용한 구현  재귀 함수를 이용한 구현
  • 18.  5!을 재귀 호출로 구현한 코드의 단계별 작동 과정  A부분에서 11행의 factorial(5)를 호출  ~ num이 5, 4, 3, 2인 상태에서 A 부분의 5~6행 실행(순환 함수 1~4회 호출) 1 2 5
  • 19.  num이 1인 상태에서 A 부분의 2~4행을 실행하여 1 반환(재귀 함수 5회 호출)  반환된 ~ num이 2, 3, 4, 5인 상태에서 B 부분의 8~9행 실행 6 5 2
  • 20.  반환된 처음 호출한 factorial(5)가 반환되어 최종 5!인 120 출력 1
  • 21.  우주선 발사 카운트다운  우주선 발사를 위해 카운트하는 코드
  • 22.  별 모양 출력하기  입력한 숫자만큼 차례대로 별 모양을 출력하는 코드
  • 23.  구구단 출력하기  2단부터 9단까지 구구단을 출력하는 코드
  • 24.  N제곱 계산하기  N제곱을 계산하는 코드
  • 25.  N제곱 계산하기  순환적인 호출 power(x, n) if n = 0 then return 1; else if n이 짝수 then return power(x2, n/2); else if n이 홀수 then return x*power(x2, (n-1)/2);
  • 26. power(2,10) 10이 짝수이므로 ➔ power( ) return 1024; power(4,5) 5가 홀수이므로 ➔ 4*power( ) return 4 * 256; power(16,2) 2이 짝수이므로 ➔ power( ) return 256; power(256,1) 1이 홀수이므로 ➔ 256*power( ) return 256 * 1; power(65536,0) return 1;  N제곱 계산하기
  • 27.  N제곱 계산하기  순환적인 방법의 시간 복잡도  n이 2의 제곱이라면 문제의 크기가 절반씩 줄어든다.  시간 복잡도  순환적인 함수: O(log2n) -> 반복문을 적용한 경우에 비해 매우 빠른 성능을 보임  반복적인 함수: O(n) 0 1 2 1 2 2 2 2 2 → → → → −  n n 순환 함수 1억 회 호출 반복 함수 1억 회 호출
  • 28.  배열의 합 계산하기  랜덤하게 생성한 배열의 합계를 구하는 코드
  • 29.  피보나치 수: 0,1,1,2,3,5,8,13,21,…      − + − = = otherwise n fib n fib n n n fib ) 1 ( ) 2 ( 1 1 0 0 ) (
  • 30.  순환적인 피보나치의 비효율성  같은 항이 중복해서 계산되어, 순환프로그램의 비효율성을 초래  n이 커지면 더욱 심각해짐 fib(2) fib(1) fib(0) fib(1) fib(1) fib(0) fib(3) fib(2) fib(4) fib(2) fib(1) fib(0) fib(1) fib(3) fib(2) fib(1) fib(0) fib(1) fib(1) fib(0) fib(3) fib(2) fib(4) fib(5) fib(6)
  • 31.  대칭문자열(회문) 판단하기  대칭문자열인 회문(Palindrome)은 앞에서부터 읽든 뒤에서부터 읽든 동일한 단어나 문장을 의미 회문 예
  • 33.  프랙탈 그리기  프랙탈(Fractal)은 작은 조각이 전체와 비슷한 기하학적인 형태를 의미(자기 유사성)  자기 유사성(Self Similarity)은 부분을 확대하면 전체와 동일한 또는 닮은 꼴의 모습을 나타 내는 성질이 있음
  • 34. 1000×1000 크기의 윈도 창을 만들고 중앙에 반지름 400 크기의 원을 그리는 코드
  • 35.  원 도형의 간단한 프랙탈 그리기 하나의 원 안에 작은 원을 2개 좌우로 그리는 것을 재귀 호출로 반복
  • 36.  원 도형의 전체 프랙탈 그리기
  • 37. def openBox() : global count print("종이 상자를 엽니다. ^^") count -= 1 if count == 0 : print("** 반지를 넣고 반환합니다. **") return openBox() print("종이 상자를 닫습니다. ^^") count = 10 openBox() # 처음 함수를 다시 호출  실행결과 Code 10-2
  • 38. def addNumber(num) : if num <= 1 : return 1 return num + addNumber(num-1) print(addNumber(10))  실행결과 Code 10-3
  • 39. def factorial(num) : if num <= 1 : print('1 반환') return 1 print("%d * %d! 호출" % (num, num-1)) retVal = factorial(num-1) print("%d * %d!(=%d) 반환" % (num, num-1, retVal)) return num * retVal print('n5! = ', factorial(5)) Code 10-4 • 실행결과
  • 40. def countDown(n) : if n == 0 : print('발사!!') else : print(n) countDown(n-1) countDown(5) Code 10-5 • 실행결과 def printStar(n) : if n > 0 : printStar(n-1) print('★' * n) printStar(5) Code 10-6 • 실행결과
  • 41. def gugu(dan, num) : print("%d x %d = %d" % (dan, num, dan*num)) if num < 9: gugu(dan, num+1) for dan in range(2,10) : print("## %d단 ##" % dan) gugu(dan, 1) Code 10-7 • 실행결과
  • 42. tab = '' def pow(x, n) : global tab tab += ' ' if n == 0 : return 1 print(tab+"%d*%d^(%d-%d)" % (x, x, n, 1)) return x * pow (x, n-1) print('2^4') print('답 -->', pow(2, 4)) Code 10-8 • 실행결과
  • 43. import random def arySum(arr, n) : if n <= 0 : return arr[0] return arySum(arr, n-1) + arr[n] ary = [random.randint(0, 255) for _ in range(random.randint(10, 20))] print(ary) print('배열 합계 -->', arySum(ary, len(ary)-1)) Code 10-9 • 실행결과
  • 44. def fibo(n) : if n == 0 : return 0 elif n == 1 : return 1 else : return fibo(n-1) + fibo(n-2) print('피보나치 수 --> 0 1 ', end='') for i in range(2, 20) : print(fibo(i), end=' ') Code 10-10 • 실행결과
  • 45. ## 함수 선언 부분 ## def palindrome(pStr) : if len(pStr) <= 1 : return True if pStr[0] != pStr[-1] : return False return palindrome(pStr[1:len(pStr)-1]) ## 전역 변수 선언 부분 ## strAry = ["reaver", "kayak", "Borrow or rob", "주유소의 소유주", "야 너 이번주 주번이 너야", "살금 살금"] ## 메인 코드 부분 ## for testStr in strAry : print(testStr, end = '--> ' ) testStr = testStr.lower().replace(' ','') if palindrome(testStr) : print('O') else : print('X') Code 10-11 • 실행결과
  • 46. from tkinter import * window = Tk() canvas = Canvas(window, height=1000, width=1000, bg='white') canvas.pack() cx=1000//2 cy=1000//2 r = 400 canvas.create_oval(cx-r, cy-r, cx+r, cy+r, width=2, outline="red") window.mainloop() Code 10-12 • 실행결과
  • 47. from tkinter import * ## 함수 선언 부분 ## def drawCircle(x, y, r) : global count count += 1 canvas.create_oval(x-r, y-r, x+r, y+r) canvas.create_text(x, y-r, text=str(count), font=('', 30)) if r >= radius/2 : drawCircle(x-r//2, y, r//2) drawCircle(x+r//2, y, r//2) ## 전역 변수 선언 부분 ## count = 0 wSize = 1000 radius = 400 ## 메인 코드 부분 ## window = Tk() canvas = Canvas(window, height=wSize, width=wSize, bg='white') drawCircle(wSize//2, wSize//2, radius) canvas.pack() window.mainloop() Code 10-13 • 실행결과
  • 48. from tkinter import * import random ## 함수 선언 부분 ## def drawCircle(x, y, r) : canvas.create_oval(x-r, y-r, x+r, y+r, width=2, outline=random.choice(colors)) if r >= 5 : drawCircle(x+r//2, y, r//2) drawCircle(x-r//2, y, r//2) ## 전역 변수 선언 부분 ## colors = ["red", "green", "blue", "black", "orange", "indigo", "violet"] wSize = 1000 radius = 400 ## 메인 코드 부분 ## window = Tk() window.title("원 모양의 프랙탈") canvas = Canvas(window, height=wSize, width=wSize, bg='white') drawCircle(wSize//2, wSize//2, radius) canvas.pack() window.mainloop() Code 10-14 • 실행결과
  • 49. ## 함수 선언 부분 ## def notation(base, n): if n < base : print(numberChar[n], end = ' ') else : notation(base, n // base) print(numberChar[n % base], end = ' ') ## 전역 변수 선언 부분 ## numberChar = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] numberChar += ['A', 'B', 'C', 'D', 'E', 'F'] ## 메인 코드 부분 ## number = int(input('10진수 입력 -->')) print('n 2진수 : ', end = ' ') notation(2, number) print('n 8진수 : ', end = ' ') notation(8, number) print('n16진수 : ', end = ' ') notation(16, number) EX 10-1 • 실행결과
  • 50. from tkinter import * ## 함수 선언 부분 ## def drawTriangle(x, y, size) : if size >= 30 : drawTriangle(x, y, size/2) # 왼쪽 아래 작은 삼각형 drawTriangle(x+size/2, y, size / 2) # 오른쪽 아래 작은 삼각형 drawTriangle(x + size / 4, int(y-size*(3**0.5)/4), size / 2) # 위쪽 작은 삼각형 else : canvas.create_polygon (x, y, x + size, y, x + size / 2, y - size*(3 ** 0.5) / 2, fill = 'red', outline = "red") ## 전역 변수 선언 부분 ## wSize = 1000 radius = 400 ## 메인 코드 부분 ## window = Tk() window.title("삼각형 모양의 프랙탈") canvas = Canvas(window, height = wSize, width = wSize, bg = 'white') drawTriangle(wSize/5, wSize/5*4, wSize*2/3) canvas.pack() window.mainloop() EX 10-2 • 실행결과
  • 51. def addNumber(num1, num2) : if num2 <= num1 : return num1 return num2 + addNumber( num1, num2 - 1 ) num1 = int(input('숫자1-->')) num2 = int(input('숫자2-->')) if num1 > num2 : num1, num2 = num2, num1 print(addNumber(num1, num2))  실행결과 Self 10-1 def gugu(dan, num) : print("%dx%d=%2d" % (dan, num, dan*num), end = ' ') if dan < 9: gugu(dan+1, num) for num in range(1,10) : gugu(2, num) print() Self 10-2  실행결과