on mgetfactorial ( me , num) factorial = 1 repeat with x = num down to 1 factorial = factorial * x end repeat return factorial end
接下来,就可以利用这个阶乘计算程序得到组合的总数:
-- 计算阶乘 listfactorial = me .mgetfactorial(plistcount) subsetfactorial = me .mgetfactorial(psubsetcount) listminussubsetfactorial = me .mgetfactorial(plistcount - psubsetcount) -- 计算组合总数 ptotal = listfactorial / (subsetfactorial * (listminussubsetfactorial)) pnumleft = ptotal
现在,借助一个索引数值,通过循环语句即可生成一个索引列表:
on mgetcombination ( me ) -- 检测是否为第一次循环 if pnumleft = ptotal then -- 是第一次循环,使用当前子列表 pnumleft = pnumleft - 1 else -- 不是第一次循环,获取新的子列表 x = psubsetcount -- 在当前子列表中循环并增值 repeat while pcurrentsubset[ x ] = plistcount - psubsetcount + x x = x - 1 end repeat pcurrentsubset[ x ] = pcurrentsubset[ x ] + 1 repeat with y = ( x + 1 ) to psubsetcount pcurrentsubset[ y ] = pcurrentsubset[ x ] + y - x end repeat -- 获取新的子列表 pnumleft = pnumleft - 1 end if end