Tentauppgift betyg C: Rekursiv bränsleåtgång - lösning

Strategi

Börja med att göra beräkningarna för 6, 5, 4, 3, 2, 1 hopp och se om någon ineffektivitet uppenbarar sig.
fuel(6) = fuel(5) + fuel(4) - 3000
        = fuel(4) + fuel(3) - 3000 + fuel(3) + fuel(2) - 3000
        = fuel(3) + fuel(2) - 3000 + fuel(2) + fuel(1) - 3000 - 3000 + fuel(2) + fuel(1) - 3000 + fuel(1) + fuel(0) - 3000 - 3000
        = ...
Ineffektiviteten ligger i att det görs onödigt många rekursiva anrop för att beräkna funktionsvärden. För att beräkna fuel(6) får vi totalt 25 anrop av fuel(5), fuel(4), fuel(3), fuel(2), fuel(1) och fuel(0). (jämför med Fibonacci-talen).

Det blir ju mycket enklare att börja med att beräkna fuel(0) och fuel(1), spara dom i en lista, sedan beräkna fuel(2) med hjälp av de sparade värdena och spara undan den, osv

Så här:

fuel(1) = 2990
fuel(2) = fuel(1) + fuel(0) - 3000= 2990
fuel(3) = fuel(2) + fuel(1) - 3000 = 2980
fuel(4) = fuel(3) + fuel(2) - 3000 = 2970
fuel(5) = fuel(4) + fuel(3) - 3000 = 2950
fuel(6) = fuel(5) + fuel(4) - 3000 = 2920