8. Още за рекурсията
Непряка рекурсия
Хилбертови криви
int x,y,h=512;
void Hilbert();
void A(int i);
void B(int i);
void C(int i);
void D(int i);
void Hilbert()
{ int i=0;
x=h/2; y=h/2;
do
{ i++; h/=2;
x=h/2; y=h/2;
A(i);
} while (h==2);
}
void A(i)
{ if (i==0) return;
D(i-1); x-=h; plot();
A(i-1); y-=h; plot();
A(i-1); x+=h; plot();
B(i-1);
}
void B(i)
{ if (i==0) return;
C(i-1); y+=h; plot();
B(i-1); x+=h; plot();
B(i-1); y-=h; plot();
A(i-1);
}
void C(i)
{ if (i==0) return;
B(i-1); x+=h; plot();
C(i-1); y+=h; plot();
C(i-1); x-=h; plot();
D(i-1);
}
void D(i)
{ if (i==0) return;
A(i-1); y-=h; plot();
D(i-1); x-=h; plot();
D(i-1); y+=h; plot();
C(i-1);
}
Hilbert.cpp
Ефективност
на рекурсията
// fibtime.cpp
#include <iostream>
using namespace std;
#include "ccc_time.cpp"
long fib(int n)
/* PURPOSE: Compute a Fibonacci
number
RECEIVES: n - an integer
RETURNS: the nth Fibonacci
number
*/
{ if (n <= 2) return 1;
else return fib(n - 1) +
fib(n - 2);
}
int main()
{ cout << "Enter n: ";
int n;
cin >> n;
Time before;
long f = fib(n);
Time after;
cout << "fib(" <<
n << ") = " << f << "\n";
cout << "Elapsed time
= " << after.seconds_from(before)
<<
" seconds\n";
return 0;
}
// fibtrace.cpp
#include <iostream>
using namespace std;
long fib(int n)
/* PURPOSE: Compute a Fibonacci
number
RECEIVES: n - an integer
RETURNS: the nth Fibonacci
number
*/
{ cout << "Entering fib: n
= " << n << "\n";
long f;
if (n <= 2) f = 1;
else f = fib(n - 1) + fib(n
- 2);
cout << "Exiting fib:
n = " << n
<<
" return value = " << f << "\n";
return f;
}
int main()
{ cout << "Enter n: ";
int n;
cin >> n;
long f = fib(n);
cout << "fib(" <<
n << ") = " << f << "\n";
return 0;
}
// fibloop.cpp
#include <iostream>
using namespace std;
#include "ccc_time.cpp"
long fib(int n)
/* PURPOSE: Compute a Fibonacci
number
RECEIVES: n - an integer
RETURNS: the nth Fibonacci
number
*/
{ if (n <= 2) return 1;
long fold = 1;
long fold2 = 1;
int i;
long fnew;
for (i = 3; i <= n; i++)
{ fnew = fold + fold2;
fold2 =
fold;
fold =
fnew;
}
return fnew;
}
int main()
{ cout << "Enter n: ";
int n;
cin >> n;
Time before;
long f = fib(n);
Time after;
cout << "fib(" <<
n << ") = " << f << "\n";
cout << "Elapsed time
= " << after.seconds_from(before)
<<
" seconds\n";
return 0;
}
* Нерекурсивният вариант е по-ефективен.
* За пресмятане на n! и двата варианта
са еднакво ефективни.
* Двоичното търсене може да се направи нерекурсивно.
* Сортиране чрез сливане е трудно да се направи
нерекурсивно.
* Бързата сортировка може да си направи нерекурсивна