Rekursion

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Rekursion

Beitrag von Codusa »

Hallo,
Also mal angenommen man will aus den Zeichen von 0-9 und a-z alle möglichen Strings generieren.
Man hat 36 Zeichen. Die Länge des Strings soll aber Variabel sein. Und Strings wie "aaaaaaa" oder "aaabbbb" sollen möglich sein
Wie realisiert man das in PB?
Natürlich per Rekursion, aber da hakts bei mir dann.

Code: Alles auswählen

Procedure proc()
  Static count,ebn
  ebn+1
  If ebn <= 0
    ProcedureReturn count
  Else
    
    For i = 0 To 35
      count + 1
;       Debug ebn
      If ebn < ListSize(word())
        ProcedureReturn proc()
      Else
        ebn-1
      EndIf
      
      
    Next
    ebn-1
    ProcedureReturn proc()
  EndIf
EndProcedure
Gibt natürlich einen Stackoverflow weil die Abbruchbedingung nicht erfüllt werden kann, ich scheitere irgendwie daran folgendes Rekursiv umzusetzen:

Code: Alles auswählen

for i=0 to 35
  for k=0 to 35
    debug str(i)+"|"+str(k)
  next
next
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Rekursion

Beitrag von ts-soft »

Codusa hat geschrieben:Hallo,
Also mal angenommen man will aus den Zeichen von 0-9 und a-z alle möglichen Strings generieren.
Man hat 36 Zeichen. Die Länge des Strings soll aber Variabel sein. Und Strings wie "aaaaaaa" oder "aaabbbb" sollen möglich sein
Wie realisiert man das in PB?
Natürlich per Rekursion, aber da hakts bei mir dann.
Wer nen Teufel tun und eine Rekursion nutzen :mrgreen:

Code: Alles auswählen

EnableExplicit

Procedure.s Proc(length)
  Protected result.s, i
  
  Dim values.c(35)
  For i = 0 To 9
    values(i) = i + 48
  Next
  For i = 10 To 35
    values(i) = i + 87
  Next  
  For i = 1 To length
    result + Chr(values(Random(35)))
  Next
  
  ProcedureReturn result
EndProcedure

Debug Proc(1)
Debug Proc(10)
Ich hoffe das macht was Du möchtest, auch wenn es sich nicht rekursiert
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
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 »

Ich mag Rekursion nicht so, deswegen hier eine iterative Variante:

Code: Alles auswählen

Procedure Words(maxLen.i)
	Protected Dim *word.Character(maxLen + 1)
	Protected Dim result.c(maxLen + 1)
	Protected i.i
	
	*word(0) = ?Chars
	result(0) = *word(0)\c
	
	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)
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: Rekursion

Beitrag von Codusa »

ts-soft hat geschrieben: Ich hoffe das macht was Du möchtest, auch wenn es sich nicht rekursiert
Nicht wirklich :(
Es sollen alle möglichen Kombinationen durchgegangen werden, wie bei NicTheQuick (Danke übrigens!)
Bei dir wird ja einfach ein zufälliges Zeichen angehängt...
Trotzdem Danke, dass du dich zu so später Stunde noch bemüht hast!
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Rekursion

Beitrag von ts-soft »

Dann hab ich das doch etwas missverstanden. Du brauchst einen Brute-Force algorhytmus :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Codusa
Beiträge: 92
Registriert: 11.07.2009 09:44

Re: Rekursion

Beitrag von Codusa »

ts-soft hat geschrieben:Dann hab ich das doch etwas missverstanden. Du brauchst einen Brute-Force algorhytmus :mrgreen:
Brauchen nicht unbedingt... :D Aber ich wollte sehen, wie so einer aussehen kann. Und wie schnell er werden kann. :mrgreen:

@NicTheQuick
Wie bekomme ich eine Mindestlänge rein?
"I became insane, with long intervals of horrible sanity." - Edgar A. Poe
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Rekursion

Beitrag von Kiffi »

NicTheQuick hat geschrieben:Ich mag Rekursion nicht so
Um Rekursionen zu mögen, muss man zunächst Rekursionen mögen. ;-)
a²+b²=mc²
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: Rekursion

Beitrag von Lord »

Kiffi hat geschrieben:
NicTheQuick hat geschrieben:Ich mag Rekursion nicht so
Um Rekursionen zu mögen, muss man zunächst Rekursionen mögen. ;-)
...und da er keine Rekursion mag, mag er keine Rekursion. :lol:
Bild
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

Re: Rekursion

Beitrag von Mr.L »

Ich mag Rekursion :wink:
Hier meine rekursive Variante

Code: Alles auswählen

#MAX_WORDLEN	= 2
Global Chars$	= "abcdefghijklmnopqrstuvwxyz0123456789"
Global Word$	= Space(#MAX_WORDLEN + 1)
Procedure GenerateWords(*word.Byte)	
	If *word\b = 0 : ProcedureReturn : EndIf
	Debug Word$
	*c.Byte = @chars$
	While *c\b
		*word\b = *c\b
		GenerateWords(*word + 1)		
		*c + 1
	Wend
	*word\b = ' '
EndProcedure
GenerateWords(@Word$)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rekursion

Beitrag von STARGÅTE »

@Mr.L:
Bitte nutze immer Character (c) als Struktur für Zeichen.
Nur dann ist sichergestellt, dass der Code auch unter Unicode läuft und zum anderen sind die Werte unsigned.
Nicht alle haben als Standard Kompilierungsformat Ascii eingestellt.
Sachen wie "*word + 1" müssten dann auch zu "*word + SizeOf(Character)" umgeschreiben werden.
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
Antworten