Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Rekursion

Postades av 2005-05-20 14:15:18 - Teodor Linder, i forum java, Tråden har 12 Kommentarer och lästs av 2264 personer

Hej,

Skulle vilja veta lite mer om rekursion och vad det innebär.


1) Vad är en rekursiv metod/funktion?
2) Hur skriver man en metod som löser ett problem, t.ex. att skriva ut en textsträng baklänges med hjälp av en rekursiv metod. Förklara också gärna hur denna fungerar.
3) Exempel på när rekursiva metoder är lämpliga att använda.


Mvh
Teo


Svara

Sv: Rekursion

Postades av 2005-05-20 14:57:37 - Tomas Johansson

(1) En metod som anropar sig själv.

(2) Att skriva en text baklänges är inte ett typiskt exempel på när rekursion bör användas.
(se punkt 3 nedan)
Det är egentligen inte att beräkna fakulteten heller, eftersom den lätt kan beräknas utan rekursion, men av någon anledning brukar en fakultet ofta användas som exempel, kanske för att det brukar anses som ett litet pedagogiskt exempel som är enkelt att förstå.
Här har jag i alla fall ett sådant fakultets-exempel:

long fakulteten(int heltal) {

if(heltal < 0)
{
throw new IllegalArgumentException("Fakulteten är odefinierad för negativa tal");
}

/*
if(heltal > MAX) // prova med olika inparamtrar för att fastställa maxvärdet som metoden kommer att klara
{
throw new IllegalArgumentException("Datorn klarar inte att korrekt beräkna fakulteten för ett så stort tal");
}
*/

if(heltal > 1)
{
// på raden nedan görs det rekursiva anropet
return heltal * fakulteten(heltal-1);
// för varje anrop kommer heltalet att minska med ett
}
else
{
// när heltalet i parametern har minskat till ett så avbryts rekursionen
// och en etta returneras istället
return 1;
}

}

För den som inte vet vad en fakultet är så är här är ett exempel:
fakulteten(6) = 6 * 5 * 4 * 3 * 2 * 1 = 720
(den kan förstås enkelt beräknas med en loop utan rekursion)


(3) Rekursiva metoder är oumbärliga när man hamnar i en situation där alternativet skulle vara ett oändligt antal nästlade loopar inuti varandra. Exempelvis om man på en webbsida för ett diskussionsforum vill visa alla svar på ett visst inlägg indenterat under det inlägget, och för varje nytt svar så vill man visa alla nya svar under detta o.s.v.

/ Tomas


Svara

Sv: Rekursion

Postades av 2005-05-20 16:01:24 - Per Persson

<b>1) Vad är en rekursiv metod/funktion?</b>

Här finns en tråd med information om rekursion: [Rekursion]


Svara

Sv:Rekursion

Postades av 2005-05-20 18:54:00 - Teodor Linder

Tack Per - det var jag som startade den. ;)


Svara

Sv: Rekursion

Postades av 2005-05-20 18:57:18 - Teodor Linder

Kan man lösa ytterligare problem rekursivt? Exempelvis "floodfill". Hur gör man då?


Mvh
Teodor


Svara

Sv: Rekursion

Postades av 2005-05-20 20:46:57 - Per Persson

<b>Tack Per - det var jag som startade den. ;)</b>

Låt mig omformulera mig...
Här är ett exempel på rekursion: [Rekursion]
Förstår du nu?


Svara

Sv:Rekursion

Postades av 2005-05-20 21:01:52 - Per Persson

<b>Kan man lösa ytterligare problem rekursivt? Exempelvis "floodfill". Hur gör man då?</b>

<code>floodfill(x, y, color)
{
if(pixel(x, y).color == color)
return;

pixel (x, y).color = color;

floodfill(x+1, y, color);
floodfill(x-1, y, color);
floodfill(x, y+1, color);
floodfill(x, y-1, color);
}</code>


Svara

Sv: Rekursion

Postades av 2005-05-20 23:30:12 - Andreas Paulsson

Man skall dock påpeka att rekursion kan påverka prestandan mycket negativt, speciellt om man rekurserar ner många nivåer.
En lösning som är iterativ istället för rekursiv är oftast MYCKET snabbare (t.ex. floodfill ovan).

Men ibland blir det mycket enklare och tydligare kod med rekursion (t.ex. traversering av träd), och då är det ett bra val.

/Andreas


Svara

Sv:Rekursion

Postades av 2005-05-21 11:12:55 - Teodor Linder

Per - Nu förstår jag. :-)


Svara

Sv: Rekursion

Postades av 2005-05-21 11:20:51 - Teodor Linder

Vågar man be om en förklaring på hur floodfill-koden fungerar?


Svara

Sv:Rekursion

Postades av 2005-05-21 14:19:23 - Per Persson

Principen:
För att fylla utgår man från en punkt (x, y).
Man färgar denna.
Sedan gör man samma sak med utgång från i tur och ordning punkten till höger, punkten till vänster, punkten nedanför och punkten ovanför.

Men om man når en begränsning, en punkt som redan har den önskade färgen, sker inget rekursivt anrop.


Det kanske inte är riktigt så som floodfill brukar fungera. Mer korrekt är nog följande beteende:
<code>floodfill(x, y, color)
{
do_floodfill(x, y, color, pixel(x, y).color);
}

do_floodfill(x, y, color, old_color)
{
if(pixel(x, y).color != old_color)
return;

pixel (x, y).color = color;

floodfill(x+1, y, color);
floodfill(x-1, y, color);
floodfill(x, y+1, color);
floodfill(x, y-1, color);
}</code>


Svara

Sv: Rekursion

Postades av 2005-05-23 12:04:49 - Johan Bovin

Jag brukar använda rekursion när jag tar mig igenom en hierarkisk struktur (t.ex. ett filträd).


Svara

Nyligen

  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 843
27 961
271 763
774
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies