Ik zal een poging doen de code uit te leggen:
Dit is dus in zijn totaliteit een HTML pagina die je zo in notepad kan plakken en als .html kan opslaan om vervolgens in je browser te openen.
Er zit een inputveld in waar je de combinatie (bijvoorbeeld 123) in kan opgeven; als je op de knop drukt komen daaronder de permutaties van die combinatie te staan.
De functie calculate() doet niets anders dan de ingevoerde combinatie in een array zetten, die array heet dus numA en bij invoer van 123 wordt die als volgt gevuld:
code:
1
2
3
| numA[0] = 1;
numA[1] = 2;
numA[2] = 3; |
Vervolgens wordt er een loopje aangeroepen om eerst alle permutaties van 1 lang te vinden; vervolgens die van 2 lang, en als laatste die van 3 lang. De functie permut() wordt dan aangeroepen met 3 parameters:
1) de numA array
2) de lengte-1
3) een (nu nog) lege string
Hier draait het dus om:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| function permut(A, num, org) {
for (var i = 0; i < A.length; i++) {
if (num == 0) {
resultHTML += org+A[i]+'<br />';
} else {
var B = new Array();
for (var t = 0; t < A.length; t++) {
if (t != i) B[B.length] = A[t];
}
var neworg = org + A[i];
permut(B, num-1, neworg);
}
}
} |
Dit is dus een recursieve functie omdat hij zichzelf weer aan kan roepen.
Stel dat ik alle permutaties van 2 lang wil vinden met de reeks 123; de originele aanroep wordt dan:
De loop in de permut() functie pakt uit het eerste argument (de array; binnen de functie genaamd A) het eerste element (1).
Het tweede argument (num) is niet gelijk aan 0, dus komen we in de else constructie.
Hier wordt een 2e array gevuld (genaamd

met alle elementen uit A behalve het 1e element. B wordt dus {2,3}.
Verder vullen we de 3e parameter (genaamd org; en die nu nog leeg is) aan met het 1e element uit A (wat dus niet in B voorkomt): org wordt dus '1'
Nu komen we bij de recursie, want we roepen vanuit de permut() functie weer de permut() functie aan, maar nu met B, num-1 en org als variabelen:
weer komen we in de loop terecht die allereerst wederom het 1e element uit de 1e parameter pakt: 2
Nu is num (de 2e parameter) wel 0, dus komen we in het 1e gedeelte van de if-else constructie terecht.
Deze vult de laatste parameter (org, die dus '1' is) aan met het huidige element uit de 1e parameter (2). Dit levert dus '12' op wat een geldige permutatie van 2 lang is, dus bewaren we die in een globale string (resultHTML) gevolgd door een enter (<BR /> in HTML) om later naar het scherm te kunnen schrijven.
Nu komen we weer in de for loop terecht die het 2e element uit de 1e parameter neemt (3).
num is nog steeds 0, dus wordt de combinatie '13' ook weggeschreven als geldig resultaat.
Alle elementen uit de 1e parameter ({2,3}) zijn nu verwerkt, dus keren we terug naar de originele aanroep van de functie.
Hier is de 1e parameter nog steeds {1,2,3}; num is nog steeds 1 en org is nog steeds leeg; echter komen we weer terug in de for-loop die nu het 2e element uit de 1e parameter pakt (2).
Omdat num 1 is komen we weer in de else constructie waar de array B ditmaal gevuld wordt met {1,3}
Weer roepen we recursief de permut() functie aan ditmaal als:
en het verhaal hierboven herhaald zich weer wat de permutaties '21' en '23' oplevert
Als het laatste element uit de oorspronkelijke 1e parameter ook zo verwerkt wordt krijgen we nog '31' en '32' als geldige permutaties; nu zijn ook alle elementen uit de array van de 1e aanroep verwerkt en zijn alle permutaties van 2 lang gevonden.
Een lange uitleg voor een kort stukje code, maar recursieve functies laten zichzelf meestal erg lastig lezen. Daarentegen zijn ze wel bijzonder krachtig, maar je moet oppassen voor infinite loops....