Det helt store problem med rekursiv udregning af fibonacci tal er ikke at der skal gemmes resultater, men snarere at mange beregninger skal udregnes mange gange. Jeg har lavet et træ til at vise, hvad der skal til, for at beregne det 10. fibonacci tal rekursivt:
http://www.the-playground.dk/uploads/images/software/fib.pngfib(10) kalder videre til fib(9) og fib(8). fib(9) kalder så også videre til fib(8) og fib(7), og så videre.
Som det kan ses, så bliver de samme beregninger og subtræer, beregnet mange gange, og det bliver værre for høje fibonacci tal.
Jeg brugte følgende kode til at generere tegningen:
- #include <stdio.h>
- #include <stdlib.h>
-
- int _fib(int num, int caller) {
- static int invocation_count = 0;
- int me = invocation_count++;
- printf(" fib_%d [label=\"fib(%d)\"];\n", me, num);
- if (caller >= 0) {
- printf(" fib_%d -> fib_%d;\n", caller, me);
- }
- return num <= 2 ? 1 : _fib(num - 1, me) + _fib(num - 2, me);
- }
-
- int fib(int num) {
- return _fib(num, -1);
- }
-
- int main(int argc, const char *argv[]) {
- int num = argc > 1 ? atoi(argv[1]) : 10;
- printf("digraph G {\n");
- fib(num);
- printf("}\n");
- return 0;
- }
Resultatet fodrede jeg til Graphiviz Dot værktøjet, som kan hentes herfra:
http://www.graphviz.org/
Indlæg senest redigeret d. 30.10.2011 00:05 af Bruger #2695