Rekursiv in C (für den asuro):
Probelauf mit 4 Ziffern ergibt wieder 5040. Speichern will ich das Ergebniss natürlich nicht. Fragt sich nun, wie man die Symmetrien der Ziffernfolgen einbauen könnte.Code:// Zahlenproblem rekursiv in C :) 29.7.2011 mic #include "asuro-probot.h" #include "asuro-probot.c" #define ziffern 4 uint8_t muster[ziffern]; uint8_t x[10], gefunden; uint32_t nr=0; void suchen(uint8_t z) { uint8_t y; for(x[z]=0; x[z]<10; x[z]++) { gefunden=0; for(y=0; y<z; y++) if(muster[y]==x[z]) gefunden=1; if(!gefunden) { muster[z]=x[z]; if(z < (ziffern-1)) { suchen(z+1); // Rekursion! } else { if(0) // 1 bedeutet: Ausgabe der Ziffernkombinationen { PrintInt(nr); SerWrite(": ", 2); for(y=0; y<ziffern; y++) { while(!(UCSRA & 0x20)); UDR = muster[y]+'0'; } SerWrite("\r\n", 2); } nr++; } } } } int main(void) { Init(); PORTC |= 3; // Odo-PullUps simulieren für PollSwitch() StatusLED(RED); for(x[0]=0; x[0]<10; x[0]++) { muster[0]=x[0]; suchen(1); } while(1) { PrintInt(nr); SerWrite("\r\n", 2); Beep(50); } return(0); }
Gruß
mic
[Edit]
Nach der Optimierung:
Ohne Ausgabe schafft mein asuro die 10-stelligen Kombinationen in knapp 22 Minuten :)Code:// Zahlenproblem rekursiv in C :) 31.7.2011 mic #include <avr/io.h> #include <stdlib.h> #define ziffern 3 uint8_t x[10], y, gefunden; uint32_t nr=1; void SerWrite(char *data, uint8_t length); // char??? void PrintInt32(uint32_t wert); void ausgabe(void); void suchen(uint8_t z) { for(x[z]=0; x[z]<10; x[z]++) { gefunden=0; for(y=0; y<z; y++) if(x[y]==x[z]) gefunden=1; if(!gefunden) { if(z < (ziffern-1)) suchen(z+1); // Rekursion! else { ausgabe(); // Ausgabe der Ziffernkombinationen in x[0] bis x[ziffern-1] nr++; } } } } int main(void) { SerWrite("\033[1;1H", 6); // home VT100-Emulation SerWrite("\033[2J", 4); //clear terminal screen for(x[0]=0; x[0]<5; x[0]++) suchen(1); nr--; DDRD |= (1<<PD5); // Led while(1) { PrintInt32(nr); SerWrite("\r\n", 2); if(PIND & (1<<PD5)) PORTD &= ~(1<<PD5); else PORTD |= (1<<PD5); // blinken } return(0); } void SerWrite(char *data, uint8_t length) // aus der asuro-Lib { unsigned char i = 0; UCSRB = 0x08; // enable transmitter while (length > 0) { if (UCSRA & 0x20) { // wait for empty transmit buffer UDR = data[i++]; length --; } } while (!(UCSRA & 0x40)); //for (i = 0; i < 0xFE; i++) //for(length = 0; length < 0xFE; length++); } void PrintInt32(uint32_t wert) // aus der asuro-Lib { char text[7]=" "; itoa(wert,text,10); SerWrite(text,7); } void ausgabe(void) { for(y=0; y<ziffern; y++) { while(!(UCSRA & 0x20)); UDR = x[y]+'0'; } SerWrite(" ",2); for(y=0; y<ziffern; y++) { while(!(UCSRA & 0x20)); UDR = 9-x[y]+'0'; } SerWrite(" ",2); PrintInt32(nr); SerWrite("\r\n",2); }









Lesezeichen