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! и двата варианта са еднакво ефективни.
* Двоичното търсене може да се направи нерекурсивно.
* Сортиране чрез сливане е трудно да се направи нерекурсивно.
* Бързата сортировка може да си направи нерекурсивна