Rekursion

Anfängerfragen zum Programmieren mit PureBasic.
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: Rekursion

Beitrag 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()

Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rekursion

Beitrag 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 ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Rekursion

Beitrag 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) 
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Beitrag von Mr.L »

Danke für die Erklärung, STARGÅTE.
Ich bin aber auch zu verpeilt, heute. :freak:
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: Rekursion

Beitrag von Codusa »

NicTheQuick hat geschrieben:
Codusa hat geschrieben:@NicTheQuick
Wie bekomme ich eine Mindestlänge rein?
Meinst du so?
Jup, Danke! :allright:
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Antworten