Zastąpienie zagnieżdżonych pętli For rekurencją

0

Witam,
Mam taki problem:

Dim tab(2)
for a = 0 to N
  for b = 0 to N
     for c = 0 to N
       result = tab(0) *a + tab(1) *b + tab(2) *c
         if result > 2000 then print ' tu jakieś operacje zależne od wyniku
    next c
  next b
next a

Takich zagnieżdżonych For-ów mogę mieć od 5 do 15. Jak zastąpić to rekurencją? (może jakiś inny algorytm?)
Nie chciałbym amatorsko tworzyć kilka procedur z odpowiednią liczbą takich pętli, tylko jedną procedurę uniwersalną.
Dzięki wszystkim za podpowiedź.

PS. Jeśli zły dział, proszę o przeniesienie wątku.

0
Sub recur11(Optional from1 = 0, Optional to_n = 10, Optional rep = 0)
 
  Dim x

  If from1 < to_n Then
    from1 = from1 + 1
  ElseIf from1 = to_n Then
    rep = rep + 1
    from1 = 0
  End If
    
  x = rep * from1 + x
    
  If rep < 10 Then
    Call recur11(from1, to_n, rep)
  End If
  
  MsgBox (x)

End Sub
0

Ok, dzięki za odpowiedź, ale nie bardzo rozumiem jak to działa.
To czego potrzebuję to uzyskać wszystkie możliwe konfiguracje cyfr od 0 do N.
Taki kod:

Sub Wypelnij()
r = 2
 For a = 0 To 2
   For b = 0 To 2
     For c = 0 To 2
       Cells(r, 1) = a
       Cells(r, 2) = b
       Cells(r, 3) = c
       r = r + 1
     Next c
   Next b
 Next a
End Sub

generuje taką tablicę możliwości:
screenshot-20200122153457.png

Jak teraz uzyskać taką tablicę wszyzstkich możliwych kombinacji cyfr od 0 do N dla dowolnej ilości zagnieżdżonych pętli For {0, N}
Jak pisałem wcześniej liczba zagnieżdżonych For-ów jest zmienna, od około 4 do 15.
Jeszcze raz dzięki i prośba o dalsze wskazówki.

0

Potzrebujesz algorytmu na wariacje z powtórzeniami:

function variations(n, p, c):
	if length(p) == n:
		print(p)
	else:
		for i = 0 to n - 1:
			if c[i] == True:
				continue
			p.append(i) # append to the end of the vector
			variations(n, p, c)
			c[i] = False
			p.pop() # pop last element of the vector

p i c to wektory (muszą mieć dodawanie na końcu i ściaganie ostatniego elementu append/pop, a c to wektor boolean). Tam gdzie jest print(p), w tym momencie w p jest interesująca cię kolejna linijka. Czyli: [0, 0, 0], [0, 0, 1] i tak dalej, tam Musisz zaimplementować dodawanie do jakiejś globalnej tabeli, wektora, whatever.

0

OK. Dzięki, oto chyba chodziło. Przetestuję na spokojnie i dam znać na forum.
Pozdrawiam.

PS. A tak jeszcze patrzę - a w którym miejscu kończy się pętal for? Przed wejściem w rekurencję czy na końcu kodu?

0

Wszystko we wcięciu jest w pętli, i każdej innej instrukcji, czyli na końcu kodu.

0

OK. Dzięki za pomoc.
Poszperałem trochę mocniej w necie, no i jest tego trochę.
To co daje takie same wyniki jak moje zagnieżdżone Fory-y znalazłem na stronie:
https://www.geeksforgeeks.org/print-all-the-permutation-of-length-l-using-the-elements-of-an-array-iterative/

@TomaszLiMoon - podał tą stronę w poście na forum w wątku:
https://4programmers.net/Forum/C_i_C++/335451-rekurencyjne_kombinacje_bez_powtorzen

Jeszcze raz dzięki za pomoc.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1