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
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; }
Tuohan näyttää toimivan pienellä muokkauksella täydellisesti omassa koodissa, kiitoksia. Pitää vielä miettiä itse että mitenkähän ja miksi tuo oikeasti toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.