Seite 2 von 2

Re: Rekursion

Verfasst: 28.10.2011 08:23
von Mr.L
STARGÅTE hat geschrieben:@Mr.L:
Bitte nutze immer Character (c) als Struktur für Zeichen.
Stimmt, habe ich nicht dran gedacht. :oops:
hier der angepasste Code

Code: Alles auswählen

EnableExplicit
#MAX_WORDLEN = 2
Global *AllowedChars	= @"abcdefghijklmnopqrstuvwxyz0123456789"
Global GeneratedWord$	= Space(#MAX_WORDLEN)
Procedure GenerateWords(wordLen = 0)
	If wordLen > #MAX_WORDLEN : ProcedureReturn : EndIf
	Debug PeekS(@GeneratedWord$ , wordLen)
	Protected.Character *CurrentChar = @GeneratedWord$ + wordLen
	Protected.Character *nextChar = *AllowedChars	
	While *nextChar\c
		*CurrentChar\c = *nextChar\c
		GenerateWords(wordLen + SizeOf(Character))
		*nextChar + SizeOf(Character)
	Wend
EndProcedure
GenerateWords()


Re: Rekursion

Verfasst: 28.10.2011 12:10
von STARGÅTE
Nicht ganz, in PureBasic muss man sehr genau aufpassen, wann die Anzahl von Bytes erwünscht ist, und dann wirklich die Anzahl an Zeichen erwünscht ist.

Dein wordLen gibt ja die Länge in Zeichen an, das heißt unter ASCII und Unicode immer die selbe Länge.
Genauso will PeekS, die Länge in Zeichen wissen, nicht in Byte.

Hier mal der funktionierende Code:

Code: Alles auswählen

EnableExplicit

#MAX_WORDLEN = 3 ; Zeichen
Global *AllowedChars   = @"01"
Global GeneratedWord$  = Space(#MAX_WORDLEN)

Procedure GenerateWords(wordLen = 0)
   If wordLen > #MAX_WORDLEN : ProcedureReturn : EndIf
   Debug PeekS(@GeneratedWord$ , wordLen) ; Zeichen
   Protected.Character *CurrentChar = @GeneratedWord$ + wordLen*SizeOf(Character) ; Bytes
   Protected.Character *nextChar = *AllowedChars   
   While *nextChar\c
      *CurrentChar\c = *nextChar\c
      GenerateWords(wordLen + 1) ; Zeichen
      *nextChar + SizeOf(Character) ; Bytes
   Wend
EndProcedure

GenerateWords()
Hab mal nur 0 und 1 genommen, damit man es besser sieht ^^

Re: Rekursion

Verfasst: 28.10.2011 14:25
von NicTheQuick
Codusa hat geschrieben:@NicTheQuick
Wie bekomme ich eine Mindestlänge rein?
Meinst du so?

Code: Alles auswählen

Procedure Words(maxLen.i)
	Protected Dim *word.Character(maxLen + 1)
	Protected Dim result.c(maxLen + 1)
	Protected i.i
	
	;Hier werden die initialen Zeichen eingestellt
	For i = 0 To maxLen - 1
		*word(i) = ?Chars
		result(i) = *word(i)\c
	Next
	
	While (Not *word(maxLen))
		Debug PeekS(@result(0))
		*word(0) + SizeOf(Character)
		If (*word(0)\c = 0)
			i = 0
			While (*word(i)\c = 0)
				If (Not *word(i + 1))
					*word(i + 1) = ?Chars
				Else
					*word(i + 1) + SizeOf(Character)
				EndIf
				result(i + 1) = *word(i + 1)\c
				*word(i) = ?Chars
				result(i) = *word(i)\c
				i + 1
			Wend
		Else
			result(0) = *word(0)\c
		EndIf
	Wend
	
EndProcedure

DataSection
	Chars:
	Data.s "abcdefghijklmnopqrstuvwxyz0123456789"
EndDataSection

Words(2) 

Verfasst: 28.10.2011 15:23
von Mr.L
Danke für die Erklärung, STARGÅTE.
Ich bin aber auch zu verpeilt, heute. :freak:

Re: Rekursion

Verfasst: 28.10.2011 19:59
von Codusa
NicTheQuick hat geschrieben:
Codusa hat geschrieben:@NicTheQuick
Wie bekomme ich eine Mindestlänge rein?
Meinst du so?
Jup, Danke! :allright: