nienke.belgium schreef:
Maak je hier geen gebruik van voorgaande recursie ipv achterwaarts want je begint toch niet met het berekenen van f6(i) maar van f1(i)?
Dat is inderdaad verwarrend.
Bij DP lossen we ingewikkelde problemen op door deze problemen om te zetten in eenvoudiger deelproblemen, en die deelproblemen recursief op te lossen totdat we de oplossing van het oorspronkelijke ingewikkelde probleem hebben.
In het engels: de
bottom-up benadering die we bedoelen met "achterwaarts": je begint bij het eind, en eindigt bij het begin (= het oorspronkelijke probleem).
Dit in tegenstelling tot
top-down benadering ofwel "voorwaarts", waar je begint bij de vraagstelling en vanaf daar toewerkt naar het antwoord.
Een bekend voorbeeld is de Fibonacci rij, waar we Fib(1000) ook het best bottom-up berekenen (zowel wat betreft rekentijd als geheugengebruik) in vergelijking met memoizatie en/of top-down.
Maar als we uitsluitend naar de recursie kijken, dan verloopt deze inderdaad
wel voorwaarts:
van i=0 naar i=1 naar i=2, etc.
nienke.belgium schreef:
En wat zou je hier als algmeen recursie voorschrift noteren.
Kijk naar de tabel wat we gedaan hebben:
(w=aantal mogelijke worpen, o = aantal ogen met die worp)
Code: Selecteer alles
Score | w[0] w[1] w[2] w[3] ....
------+--------------------------------
o = 1 | - 1 3.5 4.25
o = 2 | - 2 3.5 4.25
o = 3 | - 3 3.5 4.25
o = 4 | - 4 4 4.25
o = 5 | - 5 5 5
o = 6 | - 6 6 6
------+------------------------------
gem: | 0 3.5 4.25 4.67 .....
De recursie = de manier waarop je de tabel invult:
Start (n=0):
gemiddelde met nul worpen = gemiddelde w[0] = 0
Recursie (n>0):
voor o = 1 .. 6:
Score(w[n],o) = max{ gemiddelde(w[n-1]), o }
gemiddelde w[n] = SOM( Score(w[n],o) ) / 6