文章目录[隐藏]
易语言使用回溯算法完成数字全全部排列。
使用算法:回溯法
问题:数学全排列
问题描述:
任意给出从1到N的N个连续的自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:
123,132,213,231,312,321。
注意:数字不能重复,N由键盘输入(N<=9)。
现在我们要求出任意一个1到9自然数的各种全排列
问题分析:
应用回溯法,每个数的取法都有N个方向(1——N),当取够N个数时,输出一个排列,然后退后一步,
取前一个数的下一个方向(即前一个数+1),并且要保证所有数字不能重复。当前数字的所有方向都取完时,
继续退一步,一直重复到第一个数为止。
程序集变量
.版本 2 .程序集 启动窗口程序集 .程序集变量 数字数组, 整数型, , "9", 存放从1开始到输入的数字之间的所有数字 .程序集变量 排列方案个数, 整数型, , , 存放找到的排列方案个数 .程序集变量 长度, 整数型, , , 存放数字排列的长度 .程序集变量 输入的数字, 整数型, , , 存放从键盘输入的数字
窗口创建完毕初始化变量
.版本 2
.子程序 __启动窗口_创建完毕
' 初始化,将排列方案个数和长度两个变量清0
排列方案个数 = 0
长度 = 0
寻找排列方案
.版本 2 .子程序 找排列方案, , , 寻找排列方案 .参数 数字参数, 整数型 .局部变量 循环变量1 .局部变量 循环变量2 .局部变量 全排列, 文本型, , , 存放一个全排列 ' 将"全排列"变量清空 全排列 = “” .变量循环首 (1, 输入的数字, 1, 循环变量1) .如果真 (判断数字 (循环变量1, 数字参数) = 真) ' 判断为真,则能够赋值,且长度加1 数字数组 [数字参数] = 循环变量1 长度 = 长度 + 1 ' 如果长度达到输入的数字大小,则表示一种组合已经完成,输出结果,相反则继续查找 .如果 (长度 = 输入的数字) ' 显示方案 .变量循环首 (1, 输入的数字, 1, 循环变量2) 全排列 = 全排列 + 到文本 (数字数组 [循环变量2]) .变量循环尾 () 显示结果框.加入项目 (全排列, ) ' 找到了一个方案,则方案个数加1 排列方案个数 = 排列方案个数 + 1 .否则 找排列方案 (数字参数 + 1) .如果结束 ' 递归的时候一定要把长度减1 长度 = 长度 - 1 .如果真结束 .变量循环尾 () 显示个数编辑框.内容 = 到文本 (排列方案个数)
判断数字
窗口放置一个编辑框,输入个数,一个显示方案个数,一个显示结果。
.版本 2 .子程序 判断数字, 逻辑型, , 判断当前数字是否能赋值给当前数组元素 .参数 当前数字, 整数型, , 存放当前数字 .参数 当前数组值, 整数型, , 存放当前数组的最大成员数 .局部变量 循环变量, 整数型 ' 依次判断当前数字是否和数字数组中已经存在的数字相同 .变量循环首 (1, 当前数组值 - 1, 1, 循环变量) ' 如果发现数字相同,则返回一个假值 .如果真 (数字数组 [循环变量] = 当前数字) 返回 (假) .如果真结束 .变量循环尾 () ' 找遍后没有发现有相同数字,则返回真 返回 (真)
执行算法
.版本 2 .子程序 _计算图形按钮_被单击 .局部变量 询问返回, 整数型 ' 接收在输入数字编辑框中输入的数字,并且这个数字只能在1-9之间 .如果 (到数值 (输入数字编辑框.内容) ≥ 1 且 到数值 (输入数字编辑框.内容) ≤ 9) .如果真 (到数值 (输入数字编辑框.内容) > 6) 询问返回 = 信息框 (“您输入的数值过大,处理数据时程序将会有一段时间无响应,是否继续?”, #是否钮 + #询问图标, “请问:”) .如果真 (询问返回 = #否钮) 返回 () .如果真结束 .如果真结束 显示结果框.清空 () ' 将“显示结果框”清空 输入的数字 = 到数值 (输入数字编辑框.内容) ' 开始找方案,从1开始 找排列方案 (1) ' 如果输入的数字不在1-9之间,则给出提示信息 .否则 信息框 (“注意:输入的数字只能在1-9之间!”, 0, ) .如果结束 排列方案个数 = 0