遞迴與組合

2021-08-21 22:45:52 字數 2159 閱讀 3376

福利彩票和體育彩票近兩年比較火暴,相應在vb論壇上大家討論也較多。其實選擇彩票與集合選擇子集相同道理。下面給出一種vb的遞迴演算法(雖然明知存入陣列會加快運算速度,但最終也沒能滿意地實現,請大家多多指教。另外,效率確實不高)

option explicit

private sub command1_click()

dim temp, i as long, starttime as long, endtime as long

starttime = timer

temp = cmn(22, 6)

endtime = timer

open "d:\mofn.txt" for binary as #1 '寫入檔案

put #1, , temp

close #1

msgbox ubound(split(temp, vbcrlf)) + 1 & " 種組合", 64, "共用時 " & endtime - starttime & " 秒" '計算組合可能情況和耗時

end sub

function cmn(byval m as integer, byval n as integer) as string ' select n number from 1~m

dim a() as string, temp as string, i as long

redim a(1 to m) '定義陣列

for i = 1 to m

a(i) = i

next

if m = 3 then

if n = 1 then cmn = 1 & vbcrlf & 2 & vbcrlf & 3

if n = 2 then cmn = "1,2" & vbcrlf & "1,3" & vbcrlf & "2,3"

if n = 3 then cmn = "1,2,3"

elseif m > 3 then

if n = 1 then cmn = join(a, vbcrlf)

if n = m then cmn = join(a, ",")

if n > 1 and n < m then

temp = cmn(m - 1, n - 1)

'debug.print m - 1 & "," & n - 1 & vbcrlf & "----------------" & vbcrlf & temp & vbcrlf & "---------------------------" & vbcrlf '可以在立即視窗檢視演算法過程

temp = replace(temp, vbcrlf, "," & m & vbcrlf) & "," & m

cmn = cmn(m - 1, n) & vbcrlf & temp

end if

end if

end function

下面給出利用集合實現不重複隨機選取某幾個號碼,這個函式也可用來實現陣列全部元素的隨機排列。

function getone(byval m as integer, byval n as integer) as string ' one random option to select n number from 1~m without repeat number

dim a() as string, temp as new collection, i as long, tempi as long

redim a(1 to n) '定義陣列

for i = 1 to m

temp.add i '可以根據需要更改

next

randomize

for i = 1 to n

tempi = int(rnd * temp.count) + 1

a(i) = temp(tempi)

temp.remove tempi

next

getone = join(a, ",")

set temp = nothing

erase a

end function

private sub command2_click()'演示用法

msgbox getone(30, 8), 64, "30選8 的一種選法"

msgbox getone(100, 100), 64, "1 到100 的一種不重複全排列"

end sub

遞迴列印組合

列印組合問題 給出數n和k 1 k n 求出c n,m 的所有組合並列印.例如n 5,k 3,則所有的組合為 5 4 3 5 4 2 5 4 1 5 3 2 5 3 1 5 2 1 4 3 2 4 3 1 4 2 1 3 2 1 如果只是求出組合數,那麼就是簡單的 單向遞迴 問題,因為存在遞推公式 ...

組合與全排列非遞迴演算法

組合與全排列非遞迴演算法 浩天 二進位制組合演算法 思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同...

排列與組合的Java遞迴實現

我們在筆試面試過程中經常會遇到關於排列與組合的問題,其實這些可以通過遞迴簡單的實現,看下面兩個例子 1 關於字串排列的問題 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。可以這樣想 固...