오늘은 Fractal 프랙탈을 표현하는 프로그램 코딩의 핵심! Recursion 재귀함수와 친해지는 시간을 가지려고 합니다~~^^*
Recursion 재귀함수는 자기 자신을 호출하여 return된 값을 가지고 어떤 일을 하는 함수라고 합니다~~^^*
그런데….!!! 자기 자신을 호출하면, 호출된 자신이 또다른 자신을 호출하고, 호출된 또다른 자신이 또또다른 자신을 호출하고, 호출된 또또다른 자신이 또또또다른 자신을 호출하고….무한대로 자기자신을 호출하다 보니, 정작 return을 하지 못하게 될 것 같아요.
호출된 마지막 자신이 있어야 그 자신이 자신을 호출한 자신에게 어떤 값을 return할 수 있는데, 호출이 끝없이 반복되니, 호출이 멈추지 않아서, 호출된 마지막 자신은 존재하지 않고, 호출을 하는 자신만 무한히 생겨나서 그런 것 같아요!!
계속 무한대의 횟수로 자신을 호출하면, 컴퓨터는 그 함수들을 호출하느라 무한대의 작업을 해야하고, 영원히 그 함수를 호출하는 작업의 늪에서 헤어나올 수 없을 것 같아요! 어머! 불쌍한 우리 컴퓨터, 어떻게 하면 좋을까요!
그런데, 다행스러운 것은, recursion 재귀 함수를 다룰 때, 프로그래밍 언어는 컴퓨터 작동의 안정성을 확보하기 위해, recursion 재귀 함수 호출을 저장하는 Stack 공간 사용을 제한하고, 그 제한선을 넘으면 자체적으로 error 메세지를 내며 프로그램 수행을 중단하는 것 같아요.
그래서, 프로그램 error를 내지 않으면서, recursion 재귀 함수를 편리하게 사용하기 위해서는, 마지막으로 호출되어 더이상 자신을 호출하지 않고 자신을 호출한 자신에게 값을 return하도록 하는 조건, 즉, 자기 호출을 멈추는 조건을 반드시 설정해 놓아야 할 것 같아요!!!
자, 그럼 지금부터 우리~~^^* recursion 재귀 함수와 친해지는 시간을 본격적으로 가져 볼게요~~^^*
보통 우리는 원을 그리기 위해서 메인 함수에서 바로 함수 ellipse()를 호출하는데요~^^*
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0);
noFill();
stroke(255)
ellipse(200, 200, 300, 300);
//캔버스 xy 위치좌표(200, 200)을 중심으로 x축 지름 300 pixel y축 지름 300 pixel의 원을 그리겠습니다~^^*
//원의 내부는 색으로 채우지 않고 투명하게, 테두리는 흰색으로 그리겠습니다.
//배경은 검은색입니다~
}
검은 배경의 투명한 몸체와 하얀 테두리의 원이 보이시나요~~^^*
이번엔 메인함수에서 원을 바로 그리지 않고, 원을 그리는 함수 drawCircle()을 따로 만들어 메인 함수에서 호출해 보겠습니다.
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0);
drawCircle(200, 200, 300);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
//함수 drawCircle을 호출하여, xy좌표(200, 200)을 중심으로 하고, xy축 지름이 300 pixel인 원을 그려 달라고 해보겠습니다.
}
function drawCircle(x, y, d) {
noFill();
stroke(255)
ellipse(x, y, d);
}
이번에는, drawCircle이 자기 자신을 호출하도록 해보겠습니다. 그런데, 호출 종료 조건을 아직은 넣지 않겠습니다. 프로그램이 호출 Stack 공간이 꽉 차면 자동적으로 error 메세지를 보내고 작동을 멈추는 것을 실험해 보겠습니다!
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0);
drawCircle(200, 200, 300);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
//함수 drawCircle을 호출하여, xy좌표(200, 200)을 중심으로 하고, xy축 지름이 300 pixel인 원을 그려 달라고 해보겠습니다.
}
function drawCircle(x, y, d) {
noFill();
stroke(255)
ellipse(x, y, d);
drawCircle(x + 20, y, d);
//x축 20 pixel 오른쪽으로 더 간 곳에 원을 또 그리자고 함수 drawCircl()이 자기 자신을 호출합니다.
//과연 어떻게 될까요?
}
아 네!!! 정말 종료 조건이 필요할 것 같아요!!! 종료 조건을 넣어 보도록 하겠습니다!!!
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0);
drawCircle(200, 200, 300);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
}
function drawCircle(x, y, d) {
noFill();
stroke(255);
ellipse(x, y, d);
if (x < width) {
drawCircle(x + 20, y, d);
}
//원중심의 x좌표가 화면안에 있을 때까지만 자기자신을 호출하도록 해 보겠습니다.
//프로그램 error가 나지 않고 적절한 때에 멈추게 될까요~~^^*
}
종료 조건을 넣었으니 우리 안심하고 이 링크를 클릭하여 프로그램을 실행해 볼까요~^^* 프로그램이 적절하게 종료될 것 같은데요~~^^*
이번엔 좀더 재미있는 반복을 보여주며 안정되게 종료하도록 만들어 보겠습니다~~^^*
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0);
drawCircle(150, 200, 300);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
}
function drawCircle(x, y, d) {
noFill();
stroke(255);
ellipse(x, y, d);
if (d > 2) {
drawCircle(x + d * 0.5, y, d * 0.5);
}
//원 지름을 1/2로 만들어 가며, 지름이 2보다 클때까지만 자기자신을 호출하도록 하겠습니다.
//지름이 2 pixel보다 작아지면 자기 호출을 멈추겠습니다.
//프로그램 error가 나지 않고 적절한 때에 멈추게 될까요~~^^*
//재미있는 그림이 그려질까요~^^*
}
오 뭔가 프랙탈의 시작인가요~~^^* 반복이 어떤 재미있는 모양을 만들어 내며 안정되게 종료하는 프로그램! 첫 번째 프랙탈 작품이예요~~~^^*
네~^^* 지름이 2이하가 되어 종료되는 모습이 캔버스 안에 담기지는 않았지만…화면 오른편 넘어서 그려지는 것 같지만…일단 재미있는 전체 모습과 안정된 종료는 우리가 만들어 낸 것 같아요!!
지름이 2보다 클 때까지만 자기호출을 반복한다는 것을 캔버스 화폭에 담아 보겠습니다!
function setup() {
createCanvas(400, 400);
}
function draw() {
background(0);
drawCircle(150, 200, 300);
//원을 그리는 함수를 호출하여 원을 그려 보겠습니다~^^*
}
function drawCircle(x, y, d) {
noFill();
stroke(255);
ellipse(x, y, d);
if (d > 2) {
drawCircle(x + 20, y , d * 0.5);
}
//원 지름을 1/2로 만들어 가며, 지름이 2보다 클때까지만 자기자신을 호출하도록 하겠습니다.
//지름이 2 pixel보다 작아지면 자기 호출을 멈추겠습니다.
//프로그램 error가 나지 않고 적절한 때에 멈추게 될까요~~^^*
//재미있는 그림이 그려질까요~^^*
// 지름이 2 pixel보다 클 때까지만 원이 그려지는 것이 눈에 보이시나요~^^*
}
지름이 작아지니 더이상 자기호출을 하지 않아서 더이상 원이 그려지지 않는 것이 눈에 보이시나요~~^^*
오늘 저와 함께 recursion 재귀 함수의 종료 조건 명시의 중요성을 공부해 주셔서 감사합니다~^^*
미아가 되지 않고 광대한 우주를 누비는 자유로운 움직임을 Fractal이 표현하려면 종료 조건이 필요하네요~^^* 다시 돌아오기 위해서 우리는 떠나는 것이니까요~^^*
아주 간단한 지시문 하나가 안전한 종료 조건과 더불어 자기 자신을 반복하면, 정말 신비롭고 아름다운 광경이 마치 끝없을 듯 펼쳐질 것 같은 이 기분좋은 예감~~^^*
우리 내일도 함께 이 예감을 따라 코딩공부 여행을 이어가 볼까요~~^^*
상쾌한 이른 아침이 시작되었네요~~^^*
오늘도 멋진 아침! 멋진 하루! 자~~~ 떠어나자! 외쳐 봐요, 우리~~^^* YEAH!
네~^^* 꿈은 이루어 집니다~~~^^*
댓글 남기기