移动一根火柴使等式成立js版本(递归)
修改成递归版本
思路:
1、设定规则数组,比如:1加一根火柴只可以变成7.
2、设定方法数组,比如:一个数增加了一根火柴,其他的数必然减少一根火柴。
3、增加Array方法,由元素名和方法,得到规则对象。
4、增加替换数组元素的方法,根据原数组和下标,得到 一个字符串。有2个方法,一个深度copy,一个普通指针,这样就可以自由选择是否改变原来的数组了。
5、主逻辑:
根据式子生成数组
遍历数组元素,匹配规则,匹配到,递归进行二次匹配。
匹配不到规则,递归下一个元素。
<html> <head> <title>移动一根火柴使等式成立js版本</title> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <script language="javascript"> //递归阶乘 function getNum(i){if (i>1){return i*getNum(i-1);}else{return 1;} } //console.log(getNum(3));/** * 规则的设定,按照信号灯样式,8就是由7根火柴棍组成 * 设定变化规则: * add: 0-》8 * 1-》7 * 3-》9 * 5-》6,9 * 6-》8 * 9-》8 * - -》+,= * sub: 6-》5 * 7-》1 * 8-》0.6,9 * 9->3,5 * + -> - * = -> - * mv: 0 -> 6,9 * 2 -> 3 * 3 -> 5 * 6 -> 9 * 9 -> 0,6 */ var data = []; data.push({a:0,b:[8],m:"add"}); //0加一根火柴可以变化为8以此类推 data.push({a:0,b:[6,9],m:"mv"}); data.push({a:1,b:[7],m:"add"}); data.push({a:2,b:[3],m:"mv"}); data.push({a:3,b:[5],m:"mv"}); data.push({a:3,b:[9],m:"add"}); data.push({a:5,b:[6,9],m:"add"}); data.push({a:6,b:[5],m:"sub"}); data.push({a:6,b:[9],m:"mv"}); data.push({a:6,b:[8],m:"add"}); data.push({a:7,b:[1],m:"sub"}); data.push({a:8,b:[0,6,9],m:"sub"}); data.push({a:9,b:[0,6],m:"mv"}); data.push({a:9,b:[3,5],m:"sub"}); data.push({a:9,b:[8],m:"add"}); data.push({a:"+",b:["-"],m:"sub"}); data.push({a:"-",b:["+","="],m:"add"}); data.push({a:"=",b:["-"],m:"sub"});//修改数组,增加方法 可以由key和method得到唯一的变化规则对象。 Array.prototype.get = function(key, method){for(var i = 0; i < this.length; i++){if(this[i].a == key && this[i].m == method){return this[i];}} }/** * 转换字符串:将原式子替换成根据规则变换后的式子 * params: * ori: 原式子 * index: 需要替换的位置 * fin: 根据规则替换的数字 * * return 替换后的字符串 */ function changeStr(ori, index, fin){var str = ori.substr(0, index) + fin + ori.substring(index+1, ori.length); return str; }//返回替换后的字符串,并不改变原来数组的值,深度copy function changeArrMirror(oriArr, index, fin){var tempArr = oriArr.slice(0);tempArr[index] = fin; var str = tempArr.join("");return str; }//返回替换后的字符串,并改变原来数组的值,指针copy function changeArrAll(oriArr, index, fin){oriArr[index] = fin; var str = oriArr.join("");return str; }/** * 计算主体方法:以2+3=6为例 * 基本逻辑:得到原字符串数组[2, +, 3, =, 6],从第一位开始,查找规则, * 匹配到规则,递归下一个元素查找相反规则,构成字符串,查看是否成立,成立则打印,继续程序,查找下一个成立等式 * 匹配不到规则,递归下一个方法元素,都匹配不到,递归下一个式子元素。 * param: * originArr: 拆分的待匹配的数组 * originIndex: 式子数组的索引,正在匹配的元素下标 * methodIndex: 方法数组的索引 * isChanged: 是否匹配了第一个元素 * return: */ function compare(originArr, originIndex, methodIndex, isChanged){if (originIndex >= originArr.length){return;}if (methodIndex == 2){isChanged = true;}//已经匹配第一次的式子,进行第二次匹配,需要得到 methodArr[methodIndex]的成对方法匹配// 匹配不到规则,递归式子数组的下一个值// 匹配到规则,循环查看规则的值,看是否有能另等式成立的,如果都不能成立,递归式子数组的下一个值if(isChanged){var role = data.get(originArr[originIndex], methodArr[methodIndex][1]);if (role == undefined || role == null){compare(originArr, originIndex + 1, methodIndex, isChanged);}else{for (var matchIndex=0; matchIndex < role.b.length; matchIndex++){var changedStr = changeArrMirror(originArr, originIndex, role.b[matchIndex]); if (eval(changedStr.split("=")[0]) == eval(changedStr.split("=")[1])){console.log(changedStr);flag = true;return;}}compare(originArr, originIndex + 1, methodIndex, isChanged);}}else{//匹配方法数组元素的第一个method,看是否有规则// 如果有,设定匹配标识isChanged=true,进行二次匹配// 如果没有,递归下一个式子数组元素。var role = data.get(originArr[originIndex], methodArr[methodIndex][0]);//如果没有相应rule,匹配方法数组的其他方法,直到都匹配了if (role == undefined || role == null){if (methodIndex >= methodArr.length)compare(originArr, originIndex + 1, 0, isChanged);elsecompare(originArr, originIndex, methodIndex + 1, isChanged);}else{for (var matchIndex=0; matchIndex < role.b.length; matchIndex++){var changedStr = changeArrAll(originArr, originIndex, role.b[matchIndex]); isChanged = !isChanged;compare(originArr, originIndex + 1, methodIndex, isChanged);}}} }//方法数组,成对出现 var methodArr = [["add", "sub"], ["sub", "add"], ["mv", "mv"]]; var flag = false;//得到原始式子,分割成数组,调用递归函数进行计算。 function compute(){var originStr = document.getElementById("origin").value;var baseArr = originStr.split("");for (var i=0; i<baseArr.length; i++){var tempBaseArr = baseArr.slice(0);compare(tempBaseArr, i, 0, false);}if (!flag){console.log("没有匹配答案");}}</script> </head> <body> 输入一个需要计算的式子,例如:1+2+3=6 <input id="origin" onkeypress="if(event.keyCode == 13) compute();"/> <input type="button" value="计算" onclick="compute()" /> </body> </html>
转载于:https://www.cnblogs.com/PPBoy/p/9329518.html
移动一根火柴使等式成立js版本(递归)相关推荐
- c语言----移动n根火柴使等式成立
一.项目背景 近日在观看某短视频软件时,发现某些用户直播移动火柴游戏,笔者有时会很快找出方法,有时却毫无头绪,如5+7=9,怀疑无解,故以此编程. 二.编程环境 笔者用的是 Visual Studio ...
- 企业面试题:一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式。
<p><span style="font-size:14px">一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式 ...
- 用1、2、3、4、5、6、7、8、9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次。
用1.2.3.4.5.6.7.8.9这9个数字,填入□ 中使等式□□×□□□ = □□□□ 成立,每个数字恰好只用一次. 以下是所有的7 个答案供参考: 12*483=5796 18*297=5346 ...
- php随机数字不重复使等式成立_Schur补与矩阵打洞,SMW求逆公式,分块矩阵与行列式(不)等式...
矩阵论记号约定zhuanlan.zhihu.com Schur补与矩阵打洞 考虑正态随机向量 ,求 条件分布的一个类似于线性回归的常用技巧是--寻找常值矩阵 适合 :对于正态变量而言独立等价于不相关 ...
- python的运算符号使等式成立_你所不知道的 Python 冷知识!(二)(建议收藏)
首发于微信公众号:Python编程时光 ' 每周三更新五个冷知识,欢迎前往订阅! 01. 交互式"_"操作符 对于 _ ,我想很多人都非常熟悉. 给变量取名好艰难,用 _: 懒得长 ...
- python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)
问题一: Python3.5.X中的数据类型有哪些? 答:包括整型.布尔型.字符串型.浮点型.复数.列表.字典.集合.元组. 细化来说: 1.整型包括短整型和长整型,不过我们不必过度操心细节,因为短整 ...
- php随机数字不重复使等式成立_php随机数不重复生成的五种方式
在前一篇文章中我介绍了php随机数的生成方法,我们都知道php随机数不管是在开发中,还是在移动应用中,都是不可少的一部分,平时日常开发中经常会跟php随机数打交道,那么今天就给大家介绍php随机数不重 ...
- php随机数字不重复使等式成立_当随机数遇上量子
导读 小墨读大学的时候,坊间流传着一段顺口溜,用来描述大学几门特别难学的课,其中有一句:"-随机过程随机过,量子力学量力学...",可见这两门课消耗了多少学子的脑细胞.那么,当&q ...
- 搜索法求解火柴棍等式问题 基于python
完整代码:https://download.csdn.net/download/pythonyanyan/87430541 任务描述 1.1 作业要求 用火柴棍可以摆成一个数字等式,希望移动一根火柴使 ...
最新文章
- 论文简述 | DOT:面向视觉SLAM的动态目标跟踪
- Ubuntu16 安装Jira
- centos6.5安装vnc-server
- 【学习笔记】python - pyecharts
- Laravel大型项目系列教程(三)之发表文章
- Windows10 virtualbox安装alpine+docker
- 深度卷积神经网络_深度卷积神经网络中的降采样
- 线程池中 corePoolSize, maximumPoolSize, poolSize理解
- [Ext JS6]Microloader - 微加载器
- bzoj 1303: [CQOI2009]中位数图
- Hyperledger Fabric 或 Composer 获取指定Tx_id(transactionId)的信息
- KnockoutJS 实例
- 【软件工程】——项目开发计划
- Syntax error, annotations are only available if source level is 1.5 or greater错误
- cmdb 指南_无限供应商制造商指南
- u盘安装LINUX键盘失灵,U盘装Win7系统进入pe后鼠标键盘失灵不能用怎么办?
- 霍兰德人格分析雷达图——python实现
- Dell R410 broadcom网卡驱动更新失败
- 数电6_1——时序逻辑电路概述(很久整理的,没有下文)
- EastWave应用案例:同轴线仿真