Recursie

Methode

Nogmaal de faculteit, maar nu met recursie. Recursie is het aanroepen van dezelfde methode binnen de eigen methode definitie.

Applet

Dit programma berekent de faculteit van een long integer m.b.v. recursie

H5P4.jpg (12860 bytes)

Programmacode

 
/*Programma berekent de faculteit m.b.v. recursie
en drukt van een ingetypt getal af */

import java.awt.*;	
import java.awt.event.*;						
import java.applet.Applet;

public class  FaculteitRecursief extends Applet implements ActionListener{
	Label vraag; 
	TextField invoerVeld; 
	long getal;								

    public void init() {
	vraag = new Label( "Type het getal in en druk op Enter " );
	invoerVeld = new TextField( 10 ); 
	add( vraag ); 						
	add( invoerVeld );
	invoerVeld.addActionListener(this);						
    }

    public void actionPerformed( ActionEvent e ) {
	getal= Long.parseLong(invoerVeld.getText() );
	if (getal > 20 ) // te grote getallen passen niet
	    showStatus(" Ongeldige uitkomst");
	else 
	    showStatus(" "); // wis de voorgaande tekst
	repaint();
    }

    public void paint( Graphics g ) {
	g.drawString( getal + "! = "  + faculteit(getal), 50 , 80 );
    }

    // de recursieve functie
    // de functie faculteit roept de methode fuculteit weer aan
    long faculteit( long nummer )   {                  
	if ( nummer < 1 )  // de basis geval en stop voorwaarde
	    return 1;
	else
	    return nummer * faculteit ( nummer - 1 );
    }  
}

 

Uitleg

Recursie betekent dat een functie zichzelf weer aanroept. Dit neigt tot oneindig doorgaan. Dus moet er in recursie altijd een stopvoorwaarde zijn. Hoe werkt dit? Een voorbeeld:

  1. faculteit(3)
  2. return 3 * faculteit (2);
  3. return 2 * faculteit (1);
  4. return 1 ;
  5. return 1 * 1; // uitkomst faculteit(1) is 1
  6. return 2 * 1; // uitkomst faculteit(2) is 2
  7. return 3 * 2; // uitkomst faculteit(3) is 6

Resumé

Een recursieve aanroep kan altijd worden uitgevoerd met een for-lus. Dit is vaak overzichtelijker en hierbij wordt minder geheugen gebruikt als gevolg van de admininstratie die nodig is bij het aanroepen van een methode.
Zie ook de for-lus versie van recursie

copyright ® Little World 1998