2. 재귀적 정의
( recursive definition or inductive definition)
귀납적 정의 or 재귀적 정의
정의된 요소가 그 정의의 부분으로 나타나는 정의
재귀의 구성
-1.기저(basis)의 명시
-2.귀납적 또는 재귀적 단계 정의
3. 재귀적 정의
재귀적 수열 ( recursive sequence )
- 수열에서 처음 하나 또는 두 개의 값이 알려져 있다. 그 수열의 다음 값들은 앞의 값에 의해
정의된다.
재귀적 집합 ( recursive set )
- 몇몇의 특정값들은 집합에 포함되어 있다고 알려져 있다. 집합의 다른 값들은 집합에 이미
포함된 값의 결합으로 만들어진다.
재귀적 연산 ( recursive operation )
- 몇몇의 "적은" 연산에는 값이 주어지고 다른 연산의 경우에는 앞의 값이 주어진 연산과 관
련하여 정의된다.
재귀적 알고리즘 ( recursive algorithms )
- 변수의 가장 작은 값에는 알고리즘 절차가 알려져 있다. 변수의 큰 값들에는 작은 변수값
과 연관되어 알고리즘이 자체로 수행된다.
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. 재귀적 정의
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. 피보나치 수열!
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. fibonacci function in c
int fibo(int n)
{
if( n == 1 || n == 2 ) return 1;
else return fibo(n-1) + fibo(n-2);
}
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. 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. fibonacci function in J
f1b=: {.@($:&0 1x) : ((<:@[ $: +/@|.@])^:(*@[)) NB. ??? WTF!!!!
f1b
f1b(1000)
43466557686937456435688527675040625802564660517371780402481729089536555
41794905189040387984007925516929592259308032263477520968962323987332247
1161642996440906533187938298969649928516003704476137795166849228875
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에 저장
할 필요를 없애는 알고리듬
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. 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. 기저 S(1) = 2
반복관계 S(n) = 2S(n-1)라면
폐형해(closed-form solution)은 S(n) = 2^n
이진 탐색의 비교 수
C(n)=1+C(n/2)
그렇다면 오더는 얼마가 될까?
16. 생각할 꺼리
큰문제가 동일한 작은문제로 풀린다면 재귀적 도출을 시도!
재귀적 정의가 퍼포먼스 향상을 위한 알고리즘 설계의 기반~
(백트래킹 부터 다이나믹까지)
하노이 탑을 어떻게 풀것인가?
생각해보세영
tail recursion으로 다른 간단한 recursion 변경해보기