Rekursiv
Hej jag har i uppgift att göra en funktion som först printar från n->0 och sedan 0->n rekursivt.
Det är inga problem att göra detta genom iteration, eller att göra detta rekursivt till noll, men from 0->n tycker jag är svårt.
jag tänker något sådant: Men problemet är att m ändrar värde.. tips?
När du skrivit koden för n...0 så behöver du "bara vända" på den. Du är närmare en lösning än vad du kanske tror.
Ta bort de tre första och fyra sista kodraderna i din funktion. Med en del tankemöda och minimala kodändringar har du sedan tre kodrader som löser problemet.
Lindehaven skrev:När du skrivit koden för n...0 så behöver du "bara vända" på den. Du är närmare en lösning än vad du kanske tror.
Ta bort de tre första och fyra sista kodraderna i din funktion. Med en del tankemöda och minimala kodändringar har du sedan tre kodrader som löser problemet.
Ok, tack. Jag har nu skrivit: Är detta rätt tänkt med abs? isåfall hur bestämmer jag att den ska sluta vid abs(n)-?
Får du det resultat du förväntar dig när du provar ditt program?
Lindehaven skrev:Får du det resultat du förväntar dig när du provar ditt program?
hehe nej, det går till -1000 typ sen kraschar det. men det är ju också rätt rimligt att det gör det då den aldrig bör avslutas..
Börjar misstänka att jag kanske har missförstått problemet. Jag har trott att problemet ska lösas med två olika funktioner, men ska det vara en enda funktion som gör det som efterfrågas?
Vilket värdeområde gäller för n? Vilka värden för n testar du med?
Lindehaven skrev:Börjar misstänka att jag kanske har missförstått problemet. Jag har trott att problemet ska lösas med två olika funktioner, men ska det vara en enda funktion som gör det som efterfrågas?
Vilket värdeområde gäller för n? Vilka värden för n testar du med?
Frågar är så att man ska ha en funktion som tar in ett värde, n. Sedan ska den spotta ut alla värden från n till noll och sedan tillbaka. Man ska göra detta både rekursivt och genom iteration. Min iteration blev rätt och ser ut såhär:
När du anropar en metod så hoppar du från den aktuella exekveringspunkten till en ny exekveringspunkt som är början på en metod och när den metoden returnerar så fortsätter du exekvera instruktionen efter den du ursprungliga. Detta gäller även när den metoden du anropar är samma som du är i, dvs ett rekursivt anrop.
Så din metod som tar ditt startvärde som parameter börjar rimligen med att skriva ut startvärdet. Om värdet är större än noll så vill du göra samma sak med det aktuella värdet - 1 och då kommer du in i samma metode med värdet n-1 som då skrivs ut och om det är större än 0 så anropar du metoden igen med det aktuella värdet -1 .. och så vidare. Så där kommer du att hålla på tills du kommer in med värdet 0 och då har du skrivit ut alla värden från startvärde till 0. Nu är du längst ner i en stack av anrop där varje anrop gjorts med föregående värde -1 som du nu ska traversera uppåt, dvs n=0, n=1, n=2... till n=startvärdet och det är väl precis det du vill skriva ut för att sen returnera från metoden.
Det tar ett tag att få kläm på rekursiv programmering men när man gör det kan det vara ett kraftfullt verktyg.
Lycka till.
Visa spoiler
Prova den här
def bounce(n):
print(str(n))
if n>0:
bounce(n-1)
print(str(n))