不限單詞數的完全組合函式

2021-10-05 14:16:25 字數 1884 閱讀 1102

近期一直使用vba寫程式,很多資料比對的地方需要把n個單詞進行完全亂序的自由組合。用了很多迴圈之類的演算法,但那都是在組合單詞數已知的情況下進行,而且**冗長又繁瑣。

於是,在摸索了很久之後,終於想出了利用字典和遞迴演算法的結合,寫出了不受單詞數限制的自由組合函式。

太興奮了,忍不住發個博,跟大家分享。

這個函式是在vba裡寫的,但這不重要。

1、字典物件在現在的很多語言系統裡都有,用法基本相同(參考的c#),就是一些細節的寫法不同而已。

2、演算法本身不受程式語言的限制。所以說,這個函式幾乎可以移植到任何程式語言中去。

非常簡單

sub test(

)'設定乙個字典,用於儲存初值和結果

set dic_rst = createobject(

"scripting.dictionary"

)'給字典賦初值

dic_rst(

"a b c d e")=

0'呼叫函式,結果就存在該字典中

set dic_rst = composewords(dic_rst)

endsub

也超級簡單,不算格式、注釋的話,連函式頭尾,23行

注意:函式本身也是物件型別

function composewords(

byval dic_rst as

object)as

object

'把字典中的最後乙個key提取出來

last = dic_rst.count -

1 strarr = dic_rst.keys(

)(last)

temparr = split(strarr)

'拆分單詞(預設空格分隔)

'遞迴思路:把每個單詞提出來,分別做一次正向、一次反向組合"a b" "b a"

for each firststr in temparr

'除第一詞firststr 之外,其餘全部當成第二詞對待。"")

)'遞迴中的遞迴:如果上面提取出來的「b」字串也是由多單詞組成的,

'則重複一次遞迴的計算過程,把結果放在內層遞迴字典中

if instr(sndstr,

" ")

then

set dic_snd = createobject(

"scripting.dictionary"

) dic_snd(sndstr)=0

set d_sndstr = composewords(dic_snd)

else

set d_sndstr = createobject(

"scripting.dictionary"

) d_sndstr(sndstr)=0

endif

'內層遞迴完成。無論它有幾種組合,

'都用來和第乙個提取詞firststr 做正/反組合

for each k2 in d_sndstr.keys

tempcps1 = k2 +

" "+ firststr

tempcps2 = firststr +

" "+ k2

'儲存組合結果(這裡利用了字典的不重複和快速的特性)

ifnot dic_rst.exists(tempcps1)

then dic_rst(tempcps1)=0

ifnot dic_rst.exists(tempcps2)

then dic_rst(tempcps2)=0

next

next

'本次遞迴結束並賦值

set composewords = dic_rst

endfunction

統計單詞中出現的單詞數

描述 笨小熊的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!這種方法的具體描述如下 假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn minn是乙個質數,那麼笨...

FZU 1475不同的單詞數

problem description 給出乙個英文單詞的列表,計算有多少不同的單詞在列表中。input 本題有多組輸入資料,你必須處理到eof為止 每組資料的第一行有乙個整數n,1 n 1000.下面的n行每行乙個單詞,每個單詞的長度不超過20。單詞大小寫忽略。output 每組資料輸出乙個整數,...

Shell gawk統計檔案的各個單詞數

gawk begin end datafiledatafile的內容是以空格分開,使用輸入字段分割符fs來區分每一行的單詞 通過使用內建變數nf 當前行的字段總數 通過使用以單詞作為索引的陣列,累加 通過end輸出陣列和index就可得到 cat datafile this is the heade...