首页 > 网站 > 媒体动画 > 正文

Director综合技巧:用Lingo处理组合疑难

2024-09-08 19:26:56
字体:
来源:转载
供稿:网友
用lingo解决组合问题
   原著:jerry mcmanus
   翻译:alphachi

[问题]

   有5张卡片,从中任取3张,列出所有可能的结果。

[分析]

   输入卡片列表并确定最终组合列表的长度 ——〉计算组合的总数并生成组合列表 ——〉输出组合列表

[代码]

   由于是有关排列组合的问题,必然会涉及到阶乘的计算。为了方便起见,可以先设计一个阶乘计算程序:

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

   之所以没有直接对实际的卡片列表进行直接操作,是为了让程序拥有更强的适应性。因为只要拥有了索引列表,就可以对任何传入的实际列表进行“组合”操作,而不仅仅限于这个卡片列表。当然,只需再添加一些代码,即可生成实际的结果列表:

-- 生成结果列表
combination = []
repeat with x = 1 to psubsetcount
   combination. add (pitemlist[pcurrentsubset[ x ]])
end repeat

   下面的影片便是完成后的“组合生成器”:


播放,以上示例,需下载此插件。 点击下载插件

[说明]

   这项技巧虽然比较简单,但使用的范围却非常广泛,例如卡片的随机抽取或数列的随机生成。此外,在许多涉及到需要列举组合结果的数学问题中都占有一席之地。

相关附件

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表