Rekursiv in C (für den asuro):
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);
}
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.
Gruß
mic
[Edit]
Nach der Optimierung:
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);
}
Ohne Ausgabe schafft mein asuro die 10-stelligen Kombinationen in knapp 22 Minuten :)
Lesezeichen