Hi,
i am trying to develop a code that determine the different combination of set of numbers stored in an array. e.g.
a = [2, 5, 7] then i need the program to determine and calculate the number and content of arrays of combinations as follows:
[2,5]
[2,7]
[5,7]
[2,5,7]
i have written an IDL code to so so but the result is not correct.
Any help is very appreciated
pro display, values, size
;s = Size(values)
;NY = s[3]
FOR i = 0, size-1 DO BEGIN
print, values[i]
ENDFOR
;print, NY
end
pro fill, values, size, data
for i = 0, size - 1 do begin
values[i] = data
endfor
end
pro swap, values, i, j
s = Size(values)
NY = s[3]
if (i le NY-1 and j le NY-1) then begin
temp = values[i]
values[i] = values[j]
values[j] = temp
endif
end
pro sortt, values, size
s = Size(values)
NY = s[3]
for i = 0, size-1 do begin
for j = 0, (size - 1) - i do begin
if (j ne size - 1) then begin
if (values[j+1] lt values[j]) then begin
swap, values, j, j + 1
endif
endif
endfor
;print, values[i - 1]
endfor
end
function Tot, values, size
sum = 0
for i = 0, size - 1 do begin
sum = sum + values[i]
endfor
return, sum
end
pro copy, first, second, size
for i = 0, size-1 do begin
first[i] = second[i]
endfor
end
function equal, first, second, size
result = 1 lt 2
for i = 0, size - 1 do begin ; MODIFIED
if not (first[i] = second[i]) then begin
result = 1 gt 2
return, result
endif
endfor
return, result
end
function sorted_descending, values, size
last = 2147483647
result = 1;;;;
for i = 0, size - 1 do begin
if (values[i] le last) then begin
last = values[i]
endif else begin
result = 0 ;;;
endelse
endfor
return, result
end
pro rev, values, first, last
i = first
j = last
while (i le j) do begin
swap, values, i, j
i = i + 1
j = j - 1
endwhile
end
function next_pre, values, size
if (size eq 1) then begin
n = 0
return, n
endif
i = size
while 1 do begin
k = i - 1
i = i - 2
if (values[i] lt values[k]) then begin
j = size - 1
while not (values[i] lt values[j]) do begin
j = j - 1
endwhile
swap, values, i, j
rev, values, k, size
n = 1 ;;;;;
return, n
endif
if (i eq 1) then begin
rev, values, 1, size
n = 0 ;;;;
return, n
endif
endwhile
end
pro combine1, values, length
last = intarr(10)
for size = 2, length do begin
fill, last, size, 0
sortt, values, length
;np = next_pre( values, length)
;e = equal(last, values, size)
;sd = sorted_descending(values, size)
;t = Tot(values, size)
while (next_pre (values, length) eq 1) do begin
print, "-----"
print, size
print, "-----"
if (not equal (last, values, size)) then begin
if (sorted_descending (values, size)) then begin
if (Tot (values, size)) ne 2147483647 then begin
print, "########"
display, values, size
endif
endif
endif
copy, last, values, size
endwhile
endfor
end
pro combine
values = [11, 22, 31, 14, 24, 16, 7]
length = 7
display, values, length
combine1, values, length
end
|