iteration, recursion

General FreeBASIC programming questions.
Post Reply
Baptiste
Posts: 17
Joined: May 15, 2019 10:58

iteration, recursion

Post by Baptiste »

Hello ,


To list the combinations of 3 elements in a set of nbe elements, I use the small program.

it works well, but if i want to do the same with combinations of 4 elements, i have to
to write another sequence with 4 loops.

would someone have an idea to transform this iterative method into recursive so that the same code is usable for all types of combinations of 3,4, ... 7, n elements.


Code: Select all

rem Calcul combinaisons de 3 elements dans un ensemble de nbe elements
dim k as Integer
dim k0 as Integer
dim k1 as Integer
dim k2 as Integer
dim k3 as Integer
dim compteur as integer
dim combi(1000,10) as integer
dim nbe as integer
dim q as integer

nbe=6

for k1=1 to nbe-2
   for k2=k1+1 to nbe-1
      for k3=k2+1 to nbe
         compteur=compteur+1
         combi(compteur,1)=k1 
         combi(compteur,2)=k2 
         combi(compteur,3)=k3
      next k3
   next k2
next k1

for k=1 to compteur
   print k,
   for k0=1 to 3
      print combi(k,k0);
   next k0
   print
next k
input q 
end
grindstone
Posts: 862
Joined: May 05, 2015 5:35
Location: Germany

Re: iteration, recursion

Post by grindstone »

The classic solution is a recursive calling Sub. I don't know what exactly you're intending to do, but up to a depth of 3 levels it works.

Code: Select all

Rem Calcul combinaisons de 3 elements dans un ensemble de nbe elements
Dim k As Integer
Dim k0 As Integer
Dim k1 As Integer
Dim k2 As Integer
Dim k3 As Integer
ReDim ka(1) As Integer
ReDim combi(1000,10) As Integer
Dim Shared As Integer nbe, compteur, depth
Dim q As Integer

nbe=6

For k1=1 To nbe-2
	For k2=k1+1 To nbe-1
		For k3=k2+1 To nbe
			compteur=compteur+1
			combi(compteur,1)=k1
			combi(compteur,2)=k2
			combi(compteur,3)=k3
		Next k3
	Next k2
Next k1

For k=1 To compteur
	Print k,
	For k0=1 To 3
		Print combi(k,k0);
	Next k0
	Print
Next k
? "---"

Sub recursive(combi() As Integer, ka() As Integer, level As Integer, startValue As Integer)
	For y As Integer = startValue To nbe - (depth - level)
		ka(level) = y
		If level >= depth Then
			compteur=compteur+1
			For x As Integer = 1 To depth
				combi(compteur, x) = ka(x)
			Next
		Else
			recursive(combi(), ka(), level + 1, ka(level) + 1)
		EndIf
	Next
End Sub

ReDim combi(1000,10)
depth = 3
compteur = 0
ReDim ka(depth)
recursive(combi(), ka(), 1, 1)
? compteur

For k=1 To compteur
	Print k,
	For k0=1 To depth
		Print combi(k,k0);
	Next k0
	Print
Next k
? "---"
Sleep
End
EDIT: A depth of 4 seems to work, too (if I got your intention right).
Baptiste
Posts: 17
Joined: May 15, 2019 10:58

Re: iteration, recursion

Post by Baptiste »

Thank you grindstone,

That's exactly what I wanted .
I tried with different levels (4, 5 and 6) and it works very well

thanks again
Post Reply