易语言使用递归取计算排列组合,找出从自然数1,2,...... n中任取r个数的组合。例如n=5,r=3
分析所列的10个组合,可用这样的递归思想来考虑组和函数的算法,设子程序[计算分组子程序(m,k)] 即找出自然数1,2......m中任取k个数的所有组合。当组合的第一个数字选定时,其后面的数字是从余下的m-1个数中取k-1个数的所有组合。
这就将求m个数中去r个数的组合问题转化成求m-1个数中取k-1数的组合。
计算分组子程序
界面放置三个编辑框,分别输入M,R,第三个编辑框显示组合的个数,一个列表框显示所有的结果。
.版本 2 .子程序 计算分组子程序 .参数 参数自然数, 整数型 .参数 参数组合数个数, 整数型 .局部变量 循环变量甲, 整数型 .局部变量 循环变量乙, 整数型 .局部变量 储存文本, 文本型 循环变量甲 = 参数自然数 ' 顺序选组合的最大数 .判断循环首 (循环变量甲 ≥ 参数组合数个数) 数组组合 [参数组合数个数] = 循环变量甲 ' 组合中还有其他元素 .如果 (参数组合数个数 > 1) 计算分组子程序 (循环变量甲 - 1, 参数组合数个数 - 1) .否则 ' 将数组数位定位 循环变量乙 = 位数 储存文本 = “” ' 找到一个组合将其循环显示分组的数 .判断循环首 (循环变量乙 ≥ 1) ' 得到储存文本 储存文本 = 储存文本 + 到文本 (数组组合 [循环变量乙]) + “,” 循环变量乙 = 循环变量乙 - 1 .判断循环尾 () 显示列表框.加入项目 (储存文本, ) ' 累计个数 计次 = 计次 + 1 .如果结束 循环变量甲 = 循环变量甲 - 1 .判断循环尾 ()
调用执行
.版本 2 .子程序 _计算图形按钮_被单击 .局部变量 自然数, 整数型 .局部变量 组合数个数, 整数型 .局部变量 询问返回, 整数型 位数 = 到数值 (组合数个数编辑框.内容) 自然数 = 到数值 (自然数编辑框.内容) 组合数个数 = 到数值 (组合数个数编辑框.内容) .如果真 (自然数 ≤ 0 或 组合数个数 ≤ 0) ' 必须是大于0的自然数 信息框 (“必须是大于0的自然数!”, #错误图标, “出现错误了:”) 返回 () .如果真结束 .如果真 (自然数 < 组合数个数) ' 必须是大于0的自然数 信息框 (“自然数必须大于等于组合个数!”, #错误图标, “出现错误了:”) 返回 () .如果真结束 .如果真 (自然数 > 50) 询问返回 = 信息框 (“您输入的数值过大,处理数据时程序将会有一段时间无响应,是否继续?”, #是否钮 + #询问图标, “请问:”) .如果真 (询问返回 = #否钮) 返回 () .如果真结束 .如果真结束 ' 初始化数量 计次 = 0 ' 清空 显示列表框.清空 () ' 调用计算分组子程序() 计算分组子程序 (自然数, 组合数个数) 数量编辑框.内容 = 到文本 (计次)