4. 재귀와 반복 관계
재귀적 정의
( recursive definition or inductive definition)

귀납적 정의 or 재귀적 정의
정의된 요소가 그 정의의 부분으로 나타나는 정의

재귀의 구성
-1.기저(basis)의 ...
재귀적 정의

재귀적 수열 ( recursive sequence )
- 수열에서 처음 하나 또는 두 개의 값이 알려져 있다. 그 수열의 다음 값들은 앞의 값에 의해
정의된다.

재귀적 집합 ( recursive set ...
재귀적 정의

Prime numbers
The prime numbers can be defined as consisting of:
 • 2, the smallest prime;
 • each positive intege...
재귀적 정의

one definition of the set N of natural numbers is:
 1. 0 is in N.
 2. If an element n is in N then n+1 is in N.
 3...
피보나치 수열!

F(1) = 1 , F(2) = 1 (basis 명시)
F(n) = F(n-2) + F(n-1) for n>2 (재귀적 정의)
1,1,2,3,5,8,13,21........

재귀적으로 정의된 수열
-...
fibonacci function in c

int fibo(int n)
{
       if( n == 1 || n == 2 ) return 1;
       else return fibo(n-1) + fibo(n-2...
fibonacci function in assembly code
Dump of assembler code for function fibo:          0x0804834d <fibo+37>: push %eax
0x0...
fibonacci function in Erlang

-module(fibo).
-export([fibo/1]).
fibo(0) -> 0;
fibo(1) -> 1;
fibo(N) when N > 1 -> fibo(N-1...
fibonacci function in J

 f1b=: {.@($:&0 1x) : ((<:@[ $: +/@|.@])^:(*@[)) NB. ??? WTF!!!!
 f1b




 f1b(1000)
434665576869...
fibonacci in tail recursion

int fibo(int n)
{
   fiboTail(n,1,1,1);
}

int fiboTail(int n,int i,int a,int b)
{
   if(n<=i...
fibonacci in dynamic programming!

점화식을 써보세요!


코드를 써보세요!
fibonacci in dynamic programming!


점화식 fk = fk-1 + fk-2 for k >= 2

머 똑같네
fibon[0] = 1;
fibon[1] = 1;
for (int i = 2; i <...
fibonacci in template 메타 프로그래밍.

template< unsigned N > struct Fib
{
   enum
   {
      val = Fib<N-1>::Val + Fib<N-2>::Va...
기저 S(1) = 2
반복관계 S(n) = 2S(n-1)라면
폐형해(closed-form solution)은 S(n) = 2^n


이진 탐색의 비교 수

C(n)=1+C(n/2)

그렇다면 오더는 얼마가 될까?
생각할 꺼리

큰문제가 동일한 작은문제로 풀린다면 재귀적 도출을 시도!

재귀적 정의가 퍼포먼스 향상을 위한 알고리즘 설계의 기반~
(백트래킹 부터 다이나믹까지)

하노이 탑을 어떻게 풀것인가?
생각해보세영
tail r...
요걸 그릴라면 어케할까.
Backus-Naur Form

<postal-address> ::= <name-part> <street-address> <zip-part>

   <name-part> ::= <personal-part> <last-n...
Upcoming SlideShare
Loading in …5
×

3장 자동적으로 움직이는 게임 에이전트 생성법

1,020 views
858 views

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,020
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
2
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

3장 자동적으로 움직이는 게임 에이전트 생성법

  1. 1. 4. 재귀와 반복 관계
  2. 2. 재귀적 정의 ( recursive definition or inductive definition) 귀납적 정의 or 재귀적 정의 정의된 요소가 그 정의의 부분으로 나타나는 정의 재귀의 구성 -1.기저(basis)의 명시 -2.귀납적 또는 재귀적 단계 정의
  3. 3. 재귀적 정의 재귀적 수열 ( recursive sequence ) - 수열에서 처음 하나 또는 두 개의 값이 알려져 있다. 그 수열의 다음 값들은 앞의 값에 의해 정의된다. 재귀적 집합 ( recursive set ) - 몇몇의 특정값들은 집합에 포함되어 있다고 알려져 있다. 집합의 다른 값들은 집합에 이미 포함된 값의 결합으로 만들어진다. 재귀적 연산 ( recursive operation ) - 몇몇의 "적은" 연산에는 값이 주어지고 다른 연산의 경우에는 앞의 값이 주어진 연산과 관 련하여 정의된다. 재귀적 알고리즘 ( recursive algorithms ) - 변수의 가장 작은 값에는 알고리즘 절차가 알려져 있다. 변수의 큰 값들에는 작은 변수값 과 연관되어 알고리즘이 자체로 수행된다.
  4. 4. 재귀적 정의 Prime numbers The prime numbers can be defined as consisting of: • 2, the smallest prime; • each positive integer which is not evenly divisible by any of the primes smaller than itself. The integer 2 is our base case; checking the primality of any larger integer X requires us to know the primality of every integer between X and 2, but each such integer is closer to our base case of 2 than X is.
  5. 5. 재귀적 정의 one definition of the set N of natural numbers is: 1. 0 is in N. 2. If an element n is in N then n+1 is in N. 3. N is the smallest set such satisfying (1) and (2). 지수연산에 대한 재귀적 정의 1.a^0 = 1 2. n>=1일 때 a^n=(a^(n-1))a 곱셈에 대한 재귀적 정의 1. m(1)=m 2. n>=2일 때, m(n) = m(n-1) + m
  6. 6. 피보나치 수열! F(1) = 1 , F(2) = 1 (basis 명시) F(n) = F(n-2) + F(n-1) for n>2 (재귀적 정의) 1,1,2,3,5,8,13,21........ 재귀적으로 정의된 수열 - 초기의 몇개의 값을 정의하고 그 값을 통해서 다음 값들이 정의되는 수열 반복관계 (recurrence relation 점화식이 더 익숙) f(n) = f(n-2) + f(n-1) for n > 2
  7. 7. fibonacci function in c int fibo(int n) { if( n == 1 || n == 2 ) return 1; else return fibo(n-1) + fibo(n-2); }
  8. 8. fibonacci function in assembly code Dump of assembler code for function fibo: 0x0804834d <fibo+37>: push %eax 0x08048328 <fibo+0>: push %ebp 0x0804834e <fibo+38>: call 0x8048328 <fibo> 0x08048329 <fibo+1>: mov %esp,%ebp 0x08048353 <fibo+43>: add $0x10,%esp 0x0804832b <fibo+3>: push %ebx 0x08048356 <fibo+46>: mov %eax,%ebx 0x0804832c <fibo+4>: sub $0x4,%esp 0x08048358 <fibo+48>: sub $0xc,%esp 0x0804832f <fibo+7>: cmpl $0x1,0x8(%ebp) 0x0804835b <fibo+51>: mov 0x8(%ebp),%eax 0x08048333 <fibo+11>: je 0x804833d <fibo+21> 0x0804835e <fibo+54>: sub $0x2,%eax 0x08048335 <fibo+13>: cmpl $0x2,0x8(%ebp) 0x08048361 <fibo+57>: push %eax 0x08048339 <fibo+17>: je 0x804833d <fibo+21> 0x08048362 <fibo+58>: call 0x8048328 <fibo> 0x0804833b <fibo+19>: jmp 0x8048346 <fibo+30> 0x08048367 <fibo+63>: add $0x10,%esp 0x0804833d <fibo+21>: movl $0x1,0xfffffff8(%ebp) 0x0804836a <fibo+66>: add %eax,%ebx 0x08048344 <fibo+28>: jmp 0x804836f <fibo+71> 0x0804836c <fibo+68>: mov %ebx,0xfffffff8(%ebp) 0x08048346 <fibo+30>: sub $0xc,%esp 0x0804836f <fibo+71>: mov 0xfffffff8(%ebp),%eax 0x08048349 <fibo+33>: mov 0x8(%ebp),%eax 0x08048372 <fibo+74>: mov 0xfffffffc(%ebp),%ebx 0x0804834c <fibo+36>: dec %eax 0x08048375 <fibo+77>: leave 0x08048376 <fibo+78>: ret End of assembler dump.
  9. 9. fibonacci function in Erlang -module(fibo). -export([fibo/1]). fibo(0) -> 0; fibo(1) -> 1; fibo(N) when N > 1 -> fibo(N-1) + fibo(N-2). > c(fibo) . {ok,fibo} > fibo:fibo(10). 55
  10. 10. fibonacci function in J f1b=: {.@($:&0 1x) : ((<:@[ $: +/@|.@])^:(*@[)) NB. ??? WTF!!!! f1b f1b(1000) 43466557686937456435688527675040625802564660517371780402481729089536555 41794905189040387984007925516929592259308032263477520968962323987332247 1161642996440906533187938298969649928516003704476137795166849228875
  11. 11. fibonacci in tail recursion int fibo(int n) { fiboTail(n,1,1,1); } int fiboTail(int n,int i,int a,int b) { if(n<=i) return a; else return fiboTail(n,i+1,b,a+b); } * tail recursion - 재귀의 연산을 끝(꼬리) 부터 해서 stack에 저장 할 필요를 없애는 알고리듬
  12. 12. fibonacci in dynamic programming! 점화식을 써보세요! 코드를 써보세요!
  13. 13. fibonacci in dynamic programming! 점화식 fk = fk-1 + fk-2 for k >= 2 머 똑같네 fibon[0] = 1; fibon[1] = 1; for (int i = 2; i <= n; ++i) fibon[i] = fibon[i-1] + fibon[i-2]; or fiboa = 1; fibob=1; for(int i = 2; i <= n ; ++i){ result = fiboa + fibob; fiboa=fibob; fibob=result; }
  14. 14. fibonacci in template 메타 프로그래밍. template< unsigned N > struct Fib { enum { val = Fib<N-1>::Val + Fib<N-2>::Val }; }; template <> struct Fib<0>{ enum{ Val =0 }; }; template <> struct Fib<1>{ enum{ Val =1 }; }; cout << Fib<4>::Val << endl; Fib<4>::Val 계산은 수행시간에 하는 것이 아닌 컴파일러가!
  15. 15. 기저 S(1) = 2 반복관계 S(n) = 2S(n-1)라면 폐형해(closed-form solution)은 S(n) = 2^n 이진 탐색의 비교 수 C(n)=1+C(n/2) 그렇다면 오더는 얼마가 될까?
  16. 16. 생각할 꺼리 큰문제가 동일한 작은문제로 풀린다면 재귀적 도출을 시도! 재귀적 정의가 퍼포먼스 향상을 위한 알고리즘 설계의 기반~ (백트래킹 부터 다이나믹까지) 하노이 탑을 어떻게 풀것인가? 생각해보세영 tail recursion으로 다른 간단한 recursion 변경해보기
  17. 17. 요걸 그릴라면 어케할까.
  18. 18. Backus-Naur Form <postal-address> ::= <name-part> <street-address> <zip-part> <name-part> ::= <personal-part> <last-name> <opt-jr-part> <EOL> | <personal-part> <name-part> <personal-part> ::= <first-name> | <initial> "." <street-address> ::= <house-num> <street-name> <opt-apt-num> <EOL> <zip-part> ::= <town-name> "," <state-code> <ZIP-code> <EOL> <opt-jr-part> ::= "Sr." | "Jr." | <roman-numeral> | "" [ WITH <common_table_expression> [ ,...n ] ] <common_table_expression>::= expression_name [ ( column_name [ ,...n ] ) ] AS ( CTE_query_definition

×