FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour OT. Combinacion sin repeticion (resuelto)
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
OT. Combinacion sin repeticion (resuelto)
Posted: Wed Oct 22, 2008 03:29 PM

Alguien q tenga una funcion que genere combinaciones sin repeticion, me seria de mucha ayuda, de esta forma
"n" Numeros/letras para "m" combinaciones

ABCDE para 4 combinaciones

ABCD
ABCE
ABDE
ACDE
BCDE

gracias de antemano!!!

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
OT. Combinacion sin repeticion (resuelto)
Posted: Wed Oct 22, 2008 03:54 PM
Algo así

LOCAL aDat := {A,B,C,D,E,....}
LOCAL nDat := LEN(aDat)
LOCAL aDest := ARRAY(nDat)
LOCAL nRnd := 0
LOCAL Q

--nDat
FOR Q = 1 TO LEN(aDat)
nRnd = nRandom(nDat)+1
aDest[Q] := aDat[nRnd]
ADEL(aDat,nRnd)
ASIZE(aDat,nDat)
--nDat
NEXT

aDest contendrá una de las posibles permutaciones sin variación.
(NO LO HE PROBADO PERO A PRIMERA VISTA DEBERÍA FUNCIONAR)

Después crea otra y la comparas con la primera por si coincide o no, para compararlas, mira primero si el primer elemento es distinto, sino mira el siguiente...

CIAO
Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
OT. Combinacion sin repeticion (resuelto)
Posted: Wed Oct 22, 2008 05:28 PM
GRACIAS ANTOLIN!! logre solucionar el problema de otra forma
aqui dejo el ejemplo
#include "FiveWin.ch"

FUNCTION MainTest()
local oWnd
local aPrueba:={"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"}
local aCombina
local j := 1
local h := 1
local x
local cCar := ""
local n := 7
local r := 4

	define window oWnd 
	
		oC = combina():new( n,r )
		
		do while oC:Resta()
		  cCar = ""
		  aCombina = oC:GetCombina()
		
		  for x = 1 to len( aCombina )
		    cCar += aPrueba[ aCombina[ x ] ]
		  next
			@ j,h say cCar 
			h += 8
			if h > 80
				h = 1
				j	+=1.5
			endif				
		  cCar = ""
		
		enddo
		
	activate window oWnd 

return

//devuelve un array con la combinacion 

class Combina

data aArray				// array contenedor de la combinacion
data n						// numero de elementos por grupo
data r						// elementos disponibles
data nFalta				// Contador de combinaciones
data ntotal				// total de combinaciones === n! / r! * (n - r)!

method new( n, r )

method reset()

method Resta() inline iif( ::nFalta == 0, .F., .T. )

method GetCombina ()

endclass

method new( n,r )
    ::n = n
    ::r = r
    ::aArray = array( r )
    ::nTotal = fact( ::n )/( fact( ::r ) * fact( ::n - ::r ) ) 
    ::reset ()
return self

method reset()
local i
    for i = 1 to ::r
      ::aArray[ i ] = i
    next
    ::nFalta = ::nTotal
return self

 method GetCombina()
 local i,j
 
   if ::nFalta == ::nTotal
      ::nFalta-- 
      return ::aArray
   endif
 
    i = ::r 
    
    do while ::aArray[i] == ::n - ::r + i
      i = i - 1
    enddo
			    
    ::aArray[i]++
    
    for j = i + 1 to ::r
      ::aArray[j] = ::aArray[i] + j - i
    next
    ::nFalta-- 

return ::aArray

Function Fact( n )
local nFact
if n = 0
	return 1
endif
nFact = n * Fact( n-1 )
return nFact

Continue the discussion