Python

[Python] 순환(Recursion)호출을 이용한 Fractal 프로그램

구루싸 2019. 9. 3. 23:21
반응형
SMALL

야근 때문에 한동안 학습을 못하다가

오랜만에 다시 파이썬(Python)학습 시작!

오늘의 주제는 순환(Recursion)호출입니다

순환(Recursion)호출은 함수 내부에서  자기 자신을 다시 호출하는 구조를 말합니다

이를 이용해서  일부가 전체와 비슷한 형태로 무한히 되풀이되는 기하학적인 형태인

Fractal 혹은 자기 유사성(Self-similarity) 프로그램을 작성해보겠습니다

Fractal은 Mandelbrot라는 분이 처음으로 쓴 단어로

해안선이나 나뭇가지와 같은 자연물, 수학적인 분석, 운동 모형에서 많이 발견된다고 합니다

import turtle

def tree(length):
  if length > 5: #length가 5보다 크면 순환호출을 한다
    t.forward(length) #거북이가 length만큼 선을 그린다
    t.right(20) #오른쪽으로 20도 회전한다
    tree(length-15) #순환호출
    t.left(40) #왼쪽으로 40도 회전한다
    tree(length-15) #순환호출
    t.right(20) #오른쪽으로 20도 회전한다
    t.backward(length) #length만큼 뒤로 간다

t = turtle.Turtle()
t.left(90) #거북이가 북쪽으로 바라보게 한다
t.color("blue")
t.speed(1)
tree(90)

이 프로그램을 실행시켜보면

우선 ① 길이 90짜리 직선을 하나 그리고

각도를 오른쪽으로 20도 돌려서 자기 자신 호출

 그러다 ② 5보다 작아지면 더이상 직선이 그려지지 않고

왼쪽으로 40도를 돌린다(가운데 기준으로 왼쪽 20도)

그리고 나서 ③ 자기 자신 호출(이때는 이미 5보다 작으므로 그려지지 않는다)

마지막으로 ④ 각도를 다시 가운데로 돌리고 직선을 그린 만큼 되돌아간다

이 과정을 반복하면서 나무를 그리게됩니다

(직접 동작해보시면 아시겠지만, 혹시 이해 안되시면 코드를 따라 그림을 그려보세요)

추가로 위에서 사용한 turtle graphic의 기능을 알아보겠습니다

함수 인수 설명
forward() 픽셀(pixel)값 거북이를 지정된 거리만큼 앞으로 이동한다
backward() 픽셀(pixel)값 거북이를 지정된 거리만큼 뒤로 이동한다
right() 각도 거북이를 오른쪽으로 회전시킨다
left() 각도 거북이를 왼쪽으로 회전시킨다
up(), penup() None 그림이 그려지지 않는다
down(), pendown() None 그림이 그려진다 
color() 색상 색상을 변경한다
fillcolor() 색상 채우기 색상을 변경한다
heading() None 현재의 방향을 반환한다
position() None 현재의 위치를 반환한다
goto() 좌표(x,y) 거북이를 (x,y)로 이동시킨다
begin_fill() None 채워진 다각형을 시작한다
end_fill() None 채워진 다각형을 닫는다
dot() None 현재 위치에 점을 찍는다
stamp() None 현재 위치에 거북이 모양을 남긴다
shape() 모양 거북이의 모양을 'arrow', 'classic', 'turtle', 'circle' 중의 하나로 변경한다

오늘의 학습은 이만-_-

반응형
LIST