Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Kaikkien vaihtoehtojen läpikäyminen

HeadCheese [11.02.2008 15:55:44]

#

Ajatellaan että on n systeemiä, jotka kaikki voivat olla kolmessa eri tilassa. Ohjelma saa arvon luvulle n jostain syötteestä. Miten käyn helpoiten läpi kaikki erilaiset tilat missä tämä systeemien joukko voi olla?

Itse mietin jotain tämäntapaista aluksi, mutta tuo ei kyllä näytä järkevältä jos luku n on yhtään isompi. Miten tätä nyt oikein pitäisi lähestyä?

    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            for (int k=0; k<3; k++) {
.. jne

Antti Laaksonen [11.02.2008 16:07:03]

#

Avainsana on rekursiivinen funktio. Rekursion joka tasolla valitaan yhden systeemin tila. Sitten kun kaikki tilat on valittu, yksi tilayhdistelmä on valmis. Tämä koodi soveltuu suoraan kaikkiin tapauksiin systeemien ja tilojen määrästä riippumatta.

#include <stdio.h>

#define SYSTEEMIT 5
#define TILAT 3

int valinnat[SYSTEEMIT];
int laskuri = 0;

void valmis(void) {
	int i;
	/* näytetään, mitä tiloja tuli valittua */
	for (i = 0; i < SYSTEEMIT; i++) {
		printf("%c", 'A' + valinnat[i]);
	}
	printf("\n");
	/* kasvatetaan tilayhdistelmien määrää */
	laskuri++;
}

void valinta(int kohta) {
	int i;
	/* onko kaikille systeemeille valittu tila? */
	if (kohta == SYSTEEMIT) {
		valmis();
		return;
	}
	/* valitaan tila tälle systeemille */
	for (i = 0; i < TILAT; i++) {
		valinnat[kohta] = i;
		/* siirrytään seuraavaan systeemiin */
		valinta(kohta + 1);
	}

}

int main(void) {
	/* aloitetaan ensimmäisestä systeemistä */
	valinta(0);
	printf("Yhteensä: %i\n", laskuri);
	return 0;
}

HeadCheese [11.02.2008 17:37:32]

#

Tuohan näyttää toimivan pienellä muokkauksella täydellisesti omassa koodissa, kiitoksia. Pitää vielä miettiä itse että mitenkähän ja miksi tuo oikeasti toimii.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta