Programmering
Rekursiv Funksion
Hej Derude.
Jeg skal programmere en rekursiv funktion, som returnere en liste af dens verdier, dvs funktionen skal returnere [1, 5, 17, 53, 161, 485, 1457, 4373, 13121, ....]
Rekursiv funktionen er F(n) = 3 * F(n-1) +2 , hvor F(1)=1
Jeg gør det på følgende måde, men det virker ikke, jeg har også gjort på andre måder, men jeg ikke kan få det til at fungere.
def F(n, H=[]):
x = H
if n==1:
return 1
else:
return x[3*F(n-1)+2]
Men det virker ikke. Det er et krav, at jeg skal definere funktionen som F(n, H=[]).
Jeg håber, at nogen vil hjælpe mig med koden.
På forhånd tak
Svar #3
02. november 2016 af hesch (Slettet)
Jeg aner ikke i hvilket sprog du programmerer, men i Pascal ( stor læsbarhed ) kan det skrives:
Program Demo;
var
Liste: array[1..15] of longint;
i : integer;
begin
Liste[1] := 1;
for i := 2 to 15 do
Liste[i] := 3*Liste[i-1] + 2;
end;
end.
Det oversættes formodentlig let til dit sprog.
Du må skrive hvorfor dit program "ikke virker": Er der compileringsfejl, bliver resutatet forkert, eller ?
Svar #5
02. november 2016 af Rossa
Det er Python.
Det virker ikke, med andre, jeg kan ikke lave en funktion rekursivt, der kan retunere en liste af
[F(0), F(1), F(2),..F(n)]
#3
Koden, som er skrevet #3 er ikke rekursivt, det er iterativt
Svar #6
02. november 2016 af PeterValberg
Jeg skal lige forstå opgaven ret, - du skal
lave en funktion, der kan returnere n tal
fra den givne talrække (startende fra 1 og frem)?
Og hvordan er det meningen, at du "fortæller"
programmet, hvor mange tal fra talrækken, du ønsker?
Svar #7
02. november 2016 af Rossa
Jeg skal lave en rekursiv funktion, der tager en input n, og returnere en array eller en liste som
[F(0), F(1), F(2),..F(n)].
Svar #8
02. november 2016 af PeterValberg
Det er nok ikke den mest optimale måde at gøre det på,
men det virker tilsyneladende :-)
Svar #9
02. november 2016 af Eksperimentalfysikeren
def F(n, H=[]):
x = H
if n==1:
return 1
else:
return x[3*F(n-1)+2]
?????
Jeg savner en afslutning af funktionsdefinitionen. Jeg kender ikke Python, så jeg ved ikke, hvordan det skal gøres. Jeg kan heller ikke se, om du skal returnere en tekststreng med tallene eller et array. Jeg gætter på det sidste.
Jeg er lidt skeptisk overfor "x[3...". Mangler der ikke en operator mellen x og den kantede parentes?
I samme ligning har du "...F(n-1)...", men her mangler jeg en parameter i kaldet af F. Definitionen angiver 2 parametre, men der er kun en.
Desværre ved jeg ikke, hvordan man tilføjer elementer til H. Jeg vil skrive det som H.append(x). Jeg har så et gæt på
def F(n, H=[]):
if n==1:
return 1
else:
x = 3*F(n -1,H)+2
H.append(x)
return x
END OF DEF (eller, hvad det nu hedder i Python
Svar #10
02. november 2016 af Keal (Slettet)
#8 Den funktion er ikke rekursiv
Prøv med
def F(n, H=[]):
if n == 1:
H.append(1)
else:
H.append(3*F(n-1, H)[-1]+2)
return H
#9 Python anvender ikke noget "end of function" statement. Python benytter i stedet indentation til at markere funktionsdefinationen.
Svar #11
02. november 2016 af Rossa
Tak for hjælpen til alle sammen.
Jeg bruger python 3.5 version. Jeg har brugt koden ovenfor #8, men computer-en crasher, og jeg ved ikke hvorfor. Det kan man se klar, at Peter Valberg har kørt det på sin computer, men det crasher min.
Koden virker godt i #10. og det er rekursivt. Jeg skal også programmere den også iterativt, ligesom i #8, men det lykkedes også
Svar #12
02. november 2016 af PeterValberg
#11 Jeg bruger stadig Python 2.7 måske der er nogle
kommandoer, der hedder noget andet i din version.
Svar #13
02. november 2016 af PeterValberg
Jeg har sikkert "rodet rundt" i begreberne, men bær over med mig
og fortæl mig så lige, hvorfor #8 ikke er rekursiv, sådan som jeg
ser det, så bestemmer min funktion det næste tal i rækkefølgen
på baggrund af den forrige .... er det ikke rekursivt?
Svar #14
02. november 2016 af Eksperimentalfysikeren
Man siger, at en funktion er rekursiv, hvis den kalder sig selv. Et klassisk eksempel er beregninng af n fakultet, hvor funktionen returnerer 1, hvis argumentet er 1 og ellers i*f(i-1), hvor i er argumentet.
Et andet klassisk eksempel (til skræk og advarsel) er en rekursiv funktion til beregning af Fibonacital. Den returnerer 1 for argumenterne 0 og 1, men derefter returnerer den Fibonaci(p-2) + Fibonaci(p-1), hvor p er argumentet. Analyserer man den nærmere, viser det sig at det resulterer i Fibonaci(n) kald for at beregne Finonaci(n). Funktionen "dør" ved ca n=36.
Man omskriver ofte en rekursivfunktion til en itterativ funktion, som den i #8, fordi man derved spare nogle instruktioner til kaldet. Imidlertid findes der tilfælde, hvor denne besparelse er underordnet, mens læsbarheden af koden forbedres med det rekursive kald.
Svar #15
02. november 2016 af Eksperimentalfysikeren
PS:
#13 Matematikken i #8 er rekursiv, mens kodningen er itterativ. Jeg har ikke før tænkt over denne sammenhæng. Godt set!
Svar #16
02. november 2016 af Rossa
1000 tak til alle
Svar #17
07. november 2016 af PeterValberg
Jeg kunne ikke dy mig for at prøve koden, som Keal i #10 foreslår,
den virker ganske fint i Python 2.7
Skriv et svar til: Rekursiv Funksion
Du skal være logget ind, for at skrive et svar til dette spørgsmål. Klik her for at logge ind.
Har du ikke en bruger på Studieportalen.dk?
Klik her for at oprette en bruger.