Programmering

Rekursiv Funksion

02. november 2016 af Rossa

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 #1
02. november 2016 af Rossa

 

Svar #2
02. november 2016 af Rossa

 

Brugbart svar (0)

Svar #3
02. november 2016 af hesch

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 ?


Brugbart svar (0)

Svar #4
02. november 2016 af pvm

Er sproget Python ?

- - -

mvh.

Peter Valberg


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


Brugbart svar (0)

Svar #6
02. november 2016 af pvm

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?

- - -

mvh.

Peter Valberg


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)].
 


Brugbart svar (0)

Svar #8
02. november 2016 af pvm

Det er nok ikke den mest optimale måde at gøre det på,
men det virker tilsyneladende :-)

- - -

mvh.

Peter Valberg

Vedhæftet fil:Unavngivet.jpg

Brugbart svar (0)

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


Brugbart svar (0)

Svar #10
02. november 2016 af Keal

#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å

 


Brugbart svar (0)

Svar #12
02. november 2016 af pvm

#11 Jeg bruger stadig Python 2.7 måske der er nogle
       kommandoer, der hedder noget andet i din version.

- - -

mvh.

Peter Valberg


Brugbart svar (0)

Svar #13
02. november 2016 af pvm

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?

- - -

mvh.

Peter Valberg


Brugbart svar (0)

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.


Brugbart svar (0)

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

Det kan være, at min computer har nogen problem. Version 2.7 og 3.5 er næsten ens, men koden burde ikke crashe computeren, så længe det virker i 2.7. Jeg synes, at koden er skrevet fint, men det er iterativt, som starter fra "bottom" til confition er overholdt.Jeg synes, at koden er fint i #8.
1000 tak til alle

Brugbart svar (1)

Svar #17
07. november 2016 af pvm

Jeg kunne ikke dy mig for at prøve koden, som Keal i #10 foreslår,
den virker ganske fint i Python 2.7

- - -

mvh.

Peter Valberg

Vedhæftet fil:Unavngivet.jpg

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.