Avatar billede krukken Juniormester
05. april 2006 - 14:13 Der er 16 kommentarer og
1 løsning

Generering af alle muligheder..

Hvis jeg har et array med fire pladser - eksempelvis "A","B","C" og "D" - hvordan får jeg så genereret alle mulighder med disse fire bogstaver?
Avatar billede tobiaseld Nybegynder
05. april 2006 - 14:22 #1
Mener du at du får et nyt array med ABCD, ACBD, ADCB, BCDA osv osv ?
Avatar billede tobiaseld Nybegynder
05. april 2006 - 14:23 #2
Og skal det bare virke med4 pladser eller skal størrelsen på dit Array kunne skifte ?
Avatar billede krukken Juniormester
05. april 2006 - 14:33 #3
Tak for dit indlæg.

Ja, det skal være alle muligheder. Også inklusiv AAAA og BBBB osv. Desuden skal jeg helst kunne udskift længde af arrayet. Altså så jeg eksempelvis kan lave A og AA og ABBA osv.
Avatar billede arne_v Ekspert
05. april 2006 - 15:25 #4
fast laengde => brug N nestede for loekker

variabel laengde => brug rekursion
Avatar billede arne_v Ekspert
05. april 2006 - 15:29 #5
package april;

public class Perm {
    public static void writePerm(char[] a, String prefix, int ix) {
        if(ix < a.length) {
            for(int i = 0; i < a.length; i++) {
                writePerm(a, prefix + a[i], ix + 1);
            }
        } else {
            System.out.println(prefix);
        }
    }
    public static void writePerm(char[] a) {
        writePerm(a, "", 0);
    }
    public static void main(String[] args) {
        char[] a = { 'a', 'b', 'c', 'd' };
        writePerm(a);
    }
}
Avatar billede arne_v Ekspert
05. april 2006 - 15:31 #6
en forsimpling af min kode hvor samme bogstav ikke kan bruges to gange:

public class Perm {
    public static void writePerm(char[] a, String prefix, int ix, boolean[] used) {
        if(ix < a.length) {
            for(int i = 0; i < a.length; i++) {
                if(!used[i]) {
                    used[i] = true;
                    writePerm(a, prefix + a[i], ix + 1, used);
                    used[i] = false;
                }
            }
        } else {
            System.out.println(prefix);
        }
    }
    public static void writePerm(char[] a) {
        boolean[] used = new boolean[a.length];
        writePerm(a, "", 0, used);
    }
    public static void main(String[] args) {
        char[] a = { 'a', 'b', 'c', 'd' };
        writePerm(a);
    }
}
Avatar billede krukken Juniormester
05. april 2006 - 15:59 #7
okay - jeg bruger din første klasse, da der skal være gentagelser.

Jeg forstå ikke helt
fast laengde => brug N nestede for loekker

variabel laengde => brug rekursion

Den klasse jeg bruger nu - bruger den rekursion? Kan den ikke laves om til at bruge variable længde ved at sætte endnu en for-sætning inde i writePerm?
Avatar billede krukken Juniormester
05. april 2006 - 16:00 #8
Altså istedet for at bruge N-forsætninger, kan det så ikke gøre mere generisk?
Avatar billede krukken Juniormester
05. april 2006 - 16:51 #9
Nu vil jeg lige kontrollere kode - men umiddelbart vil jeg sige at dette gør det:
public class Perm
{
    public void writePerm(char[] a, String prefix, int ix,int size)
    {
        if(ix < size)
        {
            for(int i = 0; i < a.length; i++)
            {
                writePerm(a, prefix + a[i], ix + 1,size);
            }
        }
        else
        {
            System.out.println(prefix);
        }
    }

    public static void main(String[] args)
    {
        Perm perm = new Perm();
        char[] a = { 'a', 'b', 'c', 'd','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u'};
        for(int i = 1; i < 20; i++)
        {
            perm.writePerm(a, "", 0,i);
        }
       
    }
}
Avatar billede arne_v Ekspert
05. april 2006 - 17:16 #10
mine kode eksempler bruger rekursion og kan derfor haandtere vilkaarligt lange

hvis du ved at koden kun skal virke med laengde 4 saa kan du laver 4 for loekker
inden i hinanden (det er ret triviel kode)
Avatar billede arne_v Ekspert
05. april 2006 - 17:18 #11
og jeg forstaar ikke hvad din

for(int i = 1; i < 20; i++)

goer !
Avatar billede krukken Juniormester
05. april 2006 - 17:50 #12
Den bestemmet længden af strengen der skal laves.

Er der da en smartere måde at gøre det på?
Avatar billede arne_v Ekspert
05. april 2006 - 18:14 #13
ah - nu er jeg med
Avatar billede arne_v Ekspert
05. april 2006 - 18:16 #14
den har jeg ogsaa paa lager i en lidt anden udgave:

public class Perm {
    public static void writePerm(char[] a, int len, String prefix, int ix, boolean[] used) {
        if(ix < len) {
            for(int i = 0; i < a.length; i++) {
                if(!used[i]) {
                    used[i] = true;
                    writePerm(a, len, prefix + a[i], ix + 1, used);
                    used[i] = false;
                }
            }
        } else {
            System.out.println(prefix);
        }
    }
    public static void writePerm(char[] a) {
        boolean[] used = new boolean[a.length];
        for(int i = 1; i <= a.length; i++) {
            writePerm(a, i, "", 0, used);
        }
    }
    public static void main(String[] args) {
        char[] a = { 'a', 'b', 'c', 'd' };
        writePerm(a);
    }
}
Avatar billede krukken Juniormester
05. april 2006 - 18:29 #15
Du må meget gerne ligge et svar.

Jamen de vel vel det samme? Altså den jeg har anført her tilsidst og den sidste du har anført? Min bruger bare ikke statisk funktioner. (Hvorfor er det egentlig smart i dette tilfælde?)
Avatar billede arne_v Ekspert
05. april 2006 - 18:40 #16
det er stort set hip som hap

jeg bruger static fordi det er de af natur (der er ingen data members af klassen)

og et svar
Avatar billede krukken Juniormester
05. april 2006 - 18:51 #17
Okay - mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Sparekassen Danmark

RPA-udvikler til IT-afdelingen

Arctic Import A/S

AX Controller

Cognizant Technology Solutions Denmark ApS

Test Architect - Projects