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