: . .
.
, : , .
, . , . C++ .
5.1. ( ).
int factorial(int N)
{
if (N == 0) return 1;
return N*factorial(N-1);
}
N!, . , N, N! int.
. , , , () , . , ,
N! = N∙ (N- 1)!, N ≥ 1, 0! = 1
C++ 5.1.
5.1 . , for :
for(t = 1, i = 1; i <= N; i++) t *= i;
, C++, , , , , . , :
.
.
, . , .
5.2 . , x , > , ( x ). t , , mod ( ), x mod , . , , . 5.2. ( ).
|
|
5.2 .
int gcd(int m, int n)
{
if (n == 0) return m;
return gcd(n, m%n);
}
5.3 . , , 4.1 4, ( ) , . , . .
char *a; int i;
int eval()
{
int x = 0;
while(a[i] == ' ') i++;
if (a[i] == '+')
{
i++;
return eval() + eval();
}
if (a[i] == '*')
{
i++;
return eval() * eval();
}
while((a[i] >= '0') && (a[i] <= '9'))
x = 10*x + (a[i++] - '0');
return x;
}
5.1
.
, for . , for, , , . , , . , , . . . . , , . .
, , . , . , , . 5.4 . , . , , 5.4, , , , .
5.4 .
, , .
|
|
count . , traverse, visit , . for while. traverseR . visit , .
remove . = x->next , , .
int count(link x)
{
if (x == 0) return 0;
return 1 + count(x->count)
}
void traverse(link h, void visit(link))
{
if (h == 0) return;
visit(h);
traverse(h->next, visit);
}
void traverseR(link h, void visit(link))
{
if (h == 0) return;
traverseR(h->next, visit);
visit(h);
}
void remove(link &x, Item v)
{
while(x!=0 && x->item == v)
{
link t = x;
x = x->next;
delete t;
}
if(x!= 0)
remove(x->next, v);
}
, .
, " " , .
N , [0],..., a[N-l]. :
for (t = a[0], i = 1; i < N; i++)
if (a[i] > t) t = a[i];
" ", 5.5 - ( ) ; " ".
5.5 " "
[l],..., [r] [l],, [m] [m+1] [r], () . , Item , > (, int).
, , , 1.
Item max (Item a[], int l, int r)
{
if (A == r) return a[l];
int m = (l+r)/2;
Item u = max (a, l, m);
Item v = max (a, m+1, r);
if (u > v) return u; else return v;
}
5.2 -
5.3 -
" " , 11, 6 5, 6 3 .., 1 (). , ( , ). , ; .
. N , . ( N ( 1) . () : (i) ; (ii) . 5.7 . , , (+ , ). : N N 1 , N , N 1 ( N). . . 5.4 N = 5 N = 3. ; .
|
|
5.6.
, () , , , , () .
void hanoi (int N, int d)
{
if (N = 0) return;
hanoi(N-l, -d);
shift(N, d);
hanoi(N-l, -d);
}
5.4
. ( ), 5 , ( ). . +1 -2 +1 +3+1-2+1 ( ).
, . 1/2 , 1/4 , 1/8 .. , , mark(x, h) h .
1/2" , , 0 2", . , , n 1 ..
5.7 " " ; .5.5. . , . ( ) (), ( ) (). , . 5.5 , , . , , : , , 1 . , , , , , , , , .
|
|
5.8 - ,
5.7.
void rule (int l, int r, int h)
{
int m = (l+r)/2;
if (h > 0)
{
rule(l, m, h-1);
mark(m, h);
rule(m, r, h-1);
}
}
5.8 , . (bottom-up) . , . " " , . , , , " ".
5.8
void rule (int l, int r, int h)
{
for (int t = l, j = l; t <= h; j += j, t++)
for (int i = 0; l+j+i <= r; i += j+j)
mark(l+j+i, t);
}
5.9 -
, .., . " ".
" " . , , , .
5.9 , .
int F(int i)
{
if (i < 1) return 0;
if (i == 1) return 1;
return F(i-1) + F(i-2);
}
. , FN FN+1. FN N, ~ 1,618 . , 5.9 . 5.10, , .
5.10 -
FN no , . , , , .
, N , N, :
F[0] = 0; F[1] = 1;
for(i = 2; i <= N; i++)
F[i] = F[i-1] + F[i-2]
. ; , .
. , , , , , , . (bottom-up dynamic programming). , . . , !
|
|
(top-down dynamic programming) , ( ) , . ( ) ( ). 5.10 5.9, . 5.11 , . (memoization).
5.11 -
, F9 , , .
5.10 ( )
( C++ 0) . int F(int i)
int F(int i)
{
static int knownF[maxN];
if (knownF[i]!= 0) return knownF[i];
int t = i;
if (i < 0) return 0;
if (i > 1) t = F(i-1) + F(i-2);
return knownF[i] = t;
}
: , , N , , . , , , . , , . 5.12, , , 17, ( ) 20 D 24 . .
, () . cap, i , , i- . , ( )
cap-items[i].size. : . , , .
5.12 -
() ( ) ( ). , 17; , 24.
5.11 , . , - (. . 5.13) . , 5.12. , .
5.11 ( )
, , , , , , , .
, , (. 5.13). , ,
typedef struct { int size; int val; } Item;
, N Item. () , , , .
int knap(int cap)
{
int i, space, max, t;
for (i = 0, max = 0; i < N; i++)
if ((space = cap-items[i].size) >= 0)
if ((t = knap(space) + items[i].val) > max)
max = t;
return max;
}
5.13 - .
, 5.11. . , , .
5.12 ( )
, 5.11, . , , ( ). , : itemKnown[M] , M-itemKnown[M].size, , itemKnown[M-items[M].size] ..
int knap(int M)
{
int i, space, max, maxi = 0, t;
if (maxKnown[M]!= unknown) return maxKnown[M];
for (i = 0, max = 0; i < N; i++)
if ((space = M-items[i].size) >= 0)
if ((t = knap (space) + items [i].val) > max)
{ max = t; maxi = i; }
maxKnown[M] = max; itemKnown[M] = items[maxi];
return max;
}
5.14 -
, , .
, , , .
, , , , .
, NM. , , ; .
. , , , , , . , , , .
; . ,
;
;
.
, , . , , , , , , , ( ) ( ). , 64- , . . ; , .
, , .
.
1. :
1) : ;
2) : , .
2. :
1) : ;
2) : .
3. :
1) : i- 2n-1 ;
2) : n x 2n , n- .
4. , :
1) 3, 6, 9, : PN:
, N ≥ 1, P0 = 0.
2) 2, 5, 8,: CN:
, N ≥ 1, C0 = 1.
3) 1, 4, 7,: ,
.
1. .
2. .
3. , , , .5.1.
4. , , . , , . :
//
template <class Item>
class STACK
{
// ,
Item *s;
//
int N;
public:
// - STACK
STACK(int maxN = 1000)
{
s = new Item[maxN]; N = 0;
}
//
int empty() const
{
return N == 0;
}
}
5. .