Avatar billede 3ddd Nybegynder
23. september 2005 - 00:34 Der er 15 kommentarer og
1 løsning

simpel kombinations udregner

Hej der ude...

Jeg vil gerne vide hvordan jeg laver en kombinations udregner.
Hvis jeg fx har A,B,C,D,E eller 1,2,3,4 ja eller blandet.
Så skal programmet kunne lave alle mulige kombinationer, af de tal det bliver givet.
.....................................
Avatar billede mazzoo Nybegynder
23. september 2005 - 07:49 #1
ArrayList alphas    = new ArrayList();
            ArrayList numbers    = new ArrayList();
            ArrayList combined    = new ArrayList();

            alphas.AddRange( new string[]{"A", "B", "C", "D", "E" } );
            numbers.AddRange( new int[]{ 1,2,3,4 } );

            foreach( string alpha in alphas )
                foreach( int number in numbers )
                    combined.Add( alpha + " " + number );

            foreach( string str in combined )
                Console.WriteLine( str );
Avatar billede mazzoo Nybegynder
23. september 2005 - 07:49 #2
( eksempel i C# )

-Philip
Avatar billede arne_v Ekspert
23. september 2005 - 08:39 #3
kan det samme tegn bruges 2 gange ?

er rækkefølge signifikant ?

ja & ja => mazzoo's løsning virker fint
Avatar billede arne_v Ekspert
23. september 2005 - 08:41 #4
nej og ja:

using System;

class Perm
{
    public static void WriteRecursive(string[] s, string prefix, int ix, bool[] used)
    {
        if(ix < s.Length)
        {
            for(int i = 0; i < s.Length; i++)
            {
                if(!used[i]) {
                    used[i] = true;
                    WriteRecursive(s, prefix + s[i], ix + 1, used);
                    used[i] = false;
                }
            }
        }
        else
        {
            Console.WriteLine(prefix);
        }
    }
    public static void WritePerm(string[] s)
    {
        bool[] used = new bool[s.Length];
        WriteRecursive(s, "", 0, used);
    }
    public static void Main(string[] args)
    {
        string[] s = { "A", "B", "C", "D", "E", "1", "2", "3", "4" };
        WritePerm(s);
    }
}
Avatar billede 3ddd Nybegynder
23. september 2005 - 09:33 #5
arne_v du har ikke lyst til at lige lave et par kommentar til din kode der? kan ikke helt gennemskue det hele af den..

Jeg søger at koden gerne skulle kunne kombinere ud fra det første tegn, fx hvis man har: 1,2. så starter den med at afprøve alle givende tegn en efter en 1,2, og der efter kombinere den dem ,12,21.

Det samme tegn kan bruges lige så mange gange som påkrævet, enkeltvis eller flere sammen, eller ved fx abc, er aaaa okay, bare det alle er forskellige kombinatoner...
Avatar billede arne_v Ekspert
23. september 2005 - 10:10 #6
hvis det samme tegn kan genbruges flere gange så kan du bare bruge
mazzoos løsning eller modificere min rekursive lidt til ikke at
checke på used
Avatar billede arne_v Ekspert
23. september 2005 - 10:21 #7
modficeret eksempel:

using System;

class Perm
{
    public static void WriteRecursive(string[] s, string prefix, int ix, int len)
    {
        if(ix < len)
        {
            for(int i = 0; i < s.Length; i++)
            {
                WriteRecursive(s, prefix + s[i], ix + 1, len);
            }
        }
        else
        {
            Console.WriteLine(prefix);
        }
    }
    public static void WritePerm(string[] s, int len)
    {
        WriteRecursive(s, "", 0, len);
    }
    public static void Main(string[] args)
    {
        string[] s = { "A", "B", "C" };
        WritePerm(s, 2);
    }
}
Avatar billede 3ddd Nybegynder
23. september 2005 - 10:47 #8
Jeg har ladet mig fortælle at det ser rimelig fornuftig ud, dog af en delphi programør  der ikke kan forklare mig koden, men jeg er stadig ikke med på, hvordan koden virker somhelhed, og nogle af de forskellige dele fx:
WriteRecursive
prefix
osv.

Jeg vil gerne give en del flere point, hvis du/andre ville kunne lave et komplet eksempel, hvor man har mulighed for at lave et input, og der efter kombinere den alle tegnene.
og gerne med en del kommentar.
Avatar billede arne_v Ekspert
23. september 2005 - 12:22 #9
du kalder WritePerm med det array som der skal genereres kombinationer udfra
og den længde der skal genereres

de sidste tal kan svare til antal elementer i arrayet eller være mindre men
kan ikke være større

Jeg bruger en rekursiv funktion for at kunne håndtere en variabel længde

prefix er det hidtidige

man starter med at prefix er "" og så kalder man derfor med ""+"A", ""+"B" og ""+"C"

når det nye prefix så er "A" kalder man med "A"+"A", "A"+"B" og "A"+"C"

når det nye prefix så er "B" kalder man med "B"+"A", "B"+"B" og "B"+"C"

etc.

når man har nået den rigtige længde skriver man det bare ud (eller gemmer det
hvis man skal bruge det senere)
Avatar billede arne_v Ekspert
23. september 2005 - 12:22 #10
jeg kan godt tilrette eksemplet til at læse input

men det bliver først senere
Avatar billede 3ddd Nybegynder
23. september 2005 - 12:26 #11
Okay det gav lige lidt indsigt i hvad du mener..

Helt fint for mig, ville være perfekt hvis du kunne lave det!)...
Avatar billede arne_v Ekspert
23. september 2005 - 18:37 #12
using System;

class Perm
{
    public static void WriteRecursive(string[] s, string prefix, int ix, int len)
    {
        if(ix < len)
        {
            for(int i = 0; i < s.Length; i++)
            {
                WriteRecursive(s, prefix + s[i], ix + 1, len);
            }
        }
        else
        {
            Console.WriteLine(prefix);
        }
    }
    public static void WritePerm(string[] s, int len)
    {
        WriteRecursive(s, "", 0, len);
    }
    public static void Main(string[] args)
    {
        Console.Write("Indtast antal mulige tegn: ");
        int n = int.Parse(Console.ReadLine());
        string[] s = new string[n];
        for(int i = 0; i < n; i++)
        {
            Console.Write("Indtast tegn " + i + ": ");
            s[i] = Console.ReadLine();
        }
        Console.Write("Indtast antal tegn i kombinationer: ");
        int len = int.Parse(Console.ReadLine());
        WritePerm(s, len);
    }
}
Avatar billede arne_v Ekspert
23. september 2005 - 18:38 #13
og et svar
Avatar billede 3ddd Nybegynder
23. september 2005 - 20:36 #14
Hey. tak for hjælpen.

Lige et sidste par spørgsmål, hvad har du skrivet det i? MS VC++ .NET ikke?
og, vil koden også starte med hver tegn for sig selv og op, eller hvis jeg siger 4 kombniationer starter den med AAAA?.

Tak for hjælpen ellers =)
Avatar billede arne_v Ekspert
23. september 2005 - 20:38 #15
det er C# ikke C++

jeg kunne have skrevet det i notepad men bruger tilfældigvis Sharpdevelop

hvis første tegn er A og len er 4 så vil første kombination være AAAA
Avatar billede 3ddd Nybegynder
23. september 2005 - 21:45 #16
Okay takker =)
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