近期一直使用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...