permutaties in perl

Moderators: jkien, Xilvo

Reageer
Gebruikersavatar
Berichten: 768

permutaties in perl

Volgens een youtube filmpje zou de onderstaande code de permutaties van een gegeven array moeten tonen. Het roept de PER subroutine recursief op, maar het enige dat hij print is 1 keer 1 2 3 4.
Ik heb geen idee waar de fout zit. Kan iemand helpen ?
Bedankt alvast!

sub PER()
{
$k=$_[0];
$n=$_[1];

if ($k==$n)
{
print @a,"\n";
}
else
{
for($i=$k;$i<=$n;$i++)
{
$t=$a[$k];$a[$k]=$a[$i];$a[$k]=$t;
&PER($k+1,$n);
$t=$a[$k];$a[$k]=$a[$i];$a[$k]=$t;
}
}
}

@a=(1,2,3,4);
&PER(1,4);

Gebruikersavatar
Moderator
Berichten: 9.974

Re: permutaties in perl

Ik ken perl nauwelijks en kan de code ook niet proberen maar heb je niet iets fout overgetikt?

Het lijkt me dat
$t=$a[$k];$a[$k]=$a[$i];$a[$k]=$t;
moet zijn
$t=$a[$k];$a[$k]=$a[$i];$a[$i]=$t;

En misschien moet de laatste regel
&PER(0,3);
zijn, mocht het nog niet werken. Maar dat weet ik niet zeker.

Gebruikersavatar
Berichten: 768

Re: permutaties in perl

Xilvo schreef: di 01 feb 2022, 19:47 Ik ken perl nauwelijks en kan de code ook niet proberen maar heb je niet iets fout overgetikt?

Het lijkt me dat
$t=$a[$k];$a[$k]=$a[$i];$a[$k]=$t;
moet zijn
$t=$a[$k];$a[$k]=$a[$i];$a[$i]=$t;

En misschien moet de laatste regel
&PER(0,3);
zijn, mocht het nog niet werken. Maar dat weet ik niet zeker.
Hi Xilvo,

Bedankt!
Dat was natuurlijk een stomme fout inderdaad. Ook je opmerking ivm. de array-index was juist. Maar nog een probleem blijkt te zijn dat de variabelen in perl allemaal globaal zijn, en daar kan zo'n recursieve procedure natuurlijk niks mee. Ik heb ze nu lokaal gedeclareerd, en ervoor gezorgd dat k en i de loop overleven (nog zoiets dat blijkbaar verschilt van taal tot taal), en nu doet hij het.

Voor de geinteresseerden hieronder nog even de werkende perl-code:

#!/usr/local/bin/perl

sub PER()
{
my $k=$_[0];
my $n=$_[1];

if ($k==$n)
{
print $count," ",@a,"\n";
$count++;
}
else
{
for(my $i=$k;$i<=$n;$i++)
{
my $p=$i;
my $z=$k;
$t=$a[$k];$a[$k]=$a[$i];$a[$i]=$t;
&PER($k+1,$n);
$t=$a[$z];$a[$z]=$a[$p];$a[$p]=$t;
}
}
}
$count =1;
@a=(1,2,3,4);
&PER(0,3);

Gebruikersavatar
Moderator
Berichten: 9.974

Re: permutaties in perl

Mooi dat het nu werkt.
Als ik dit lees vermoed ik dat het YT-filmpje niet over perl ging en dat je het zelf naar perl hebt vertaald?

Gebruikersavatar
Berichten: 768

Re: permutaties in perl

Dat klopt inderdaad. En daar waar in veel talen variabelen in procedures standaard lokaal zijn (denk ik), is dit bij perl niet het geval.

Gebruikersavatar
Berichten: 1.605

Re: permutaties in perl

Tegenwoordig zijn er veel online compilers. Ook voor Perl een gevonden (zelf nooit van Perl gehoord).

https://www.tutorialspoint.com/execute_perl_online.php

Leuk en leerzaam te zien dat de code functioneert en de orginele uit openings post niet. Misschien handig in de toekomst code te plaatsen met de knop: \(</>\) via [volledige bewerker en voorbeeld] en/of code direct tussen \([code]...[/code]\).

Op deze manier word de code waaraan hard gewerkt is netjes in een blok geplaatst zoals onderstaand (heb zelf enige tabs toegevoegd voor leesbaarheid wat volgens: Perl mag) online compiler functioneert in iedergeval met deze notatie (weet zelf niet optimale notatie):

Code: Selecteer alles

#!/usr/local/bin/perl

sub PER()
{
	my $k=$_[0];
	my $n=$_[1];

	if ($k==$n)
	{
		print $count," ",@a,"\n";
		$count++;
	}
	else
	{
		for(my $i=$k;$i<=$n;$i++)
		{
			my $p=$i;
			my $z=$k;
			$t=$a[$k];$a[$k]=$a[$i];$a[$i]=$t;
			&PER($k+1,$n);
			$t=$a[$z];$a[$z]=$a[$p];$a[$p]=$t;
		}
	}
}

$count =1;
@a=(1,2,3,4);
&PER(0,3);
Knap dat Xilvo het slippertje heeft gevonden. Voor mij was de notatie te ingewikkeld en afschrikkend zonder indents.

Interessant te weten dat Perl (orgineel) veel gebruikt word bij strings en teksten zoals ik begrijp.

Reageer