修改成递归版本

思路:

  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版本(递归)相关推荐

  1. c语言----移动n根火柴使等式成立

    一.项目背景 近日在观看某短视频软件时,发现某些用户直播移动火柴游戏,笔者有时会很快找出方法,有时却毫无头绪,如5+7=9,怀疑无解,故以此编程. 二.编程环境 笔者用的是 Visual Studio ...

  2. 企业面试题:一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式。

    <p><span style="font-size:14px">一个三个数的式子,移动其中一根火柴,使等式成立,用程序或实现(可以用伪码),输出能成立的等式 ...

  3. 用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 ...

  4. php随机数字不重复使等式成立_Schur补与矩阵打洞,SMW求逆公式,分块矩阵与行列式(不)等式...

    矩阵论记号约定​zhuanlan.zhihu.com Schur补与矩阵打洞 考虑正态随机向量 ,求 条件分布的一个类似于线性回归的常用技巧是--寻找常值矩阵 适合 :对于正态变量而言独立等价于不相关 ...

  5. python的运算符号使等式成立_你所不知道的 Python 冷知识!(二)(建议收藏)

    首发于微信公众号:Python编程时光 ' 每周三更新五个冷知识,欢迎前往订阅! 01. 交互式"_"操作符 对于 _ ,我想很多人都非常熟悉. 给变量取名好艰难,用 _: 懒得长 ...

  6. python的运算符号使等式成立_那些年被我坑过的Python——不得不知(第二章)

    问题一: Python3.5.X中的数据类型有哪些? 答:包括整型.布尔型.字符串型.浮点型.复数.列表.字典.集合.元组. 细化来说: 1.整型包括短整型和长整型,不过我们不必过度操心细节,因为短整 ...

  7. php随机数字不重复使等式成立_php随机数不重复生成的五种方式

    在前一篇文章中我介绍了php随机数的生成方法,我们都知道php随机数不管是在开发中,还是在移动应用中,都是不可少的一部分,平时日常开发中经常会跟php随机数打交道,那么今天就给大家介绍php随机数不重 ...

  8. php随机数字不重复使等式成立_当随机数遇上量子

    导读 小墨读大学的时候,坊间流传着一段顺口溜,用来描述大学几门特别难学的课,其中有一句:"-随机过程随机过,量子力学量力学...",可见这两门课消耗了多少学子的脑细胞.那么,当&q ...

  9. 搜索法求解火柴棍等式问题 基于python

    完整代码:https://download.csdn.net/download/pythonyanyan/87430541 任务描述 1.1 作业要求 用火柴棍可以摆成一个数字等式,希望移动一根火柴使 ...

最新文章

  1. 论文简述 | DOT:面向视觉SLAM的动态目标跟踪
  2. Ubuntu16 安装Jira
  3. centos6.5安装vnc-server
  4. 【学习笔记】python - pyecharts
  5. Laravel大型项目系列教程(三)之发表文章
  6. Windows10 virtualbox安装alpine+docker
  7. 深度卷积神经网络_深度卷积神经网络中的降采样
  8. 线程池中 corePoolSize, maximumPoolSize, poolSize理解
  9. [Ext JS6]Microloader - 微加载器
  10. bzoj 1303: [CQOI2009]中位数图
  11. Hyperledger Fabric 或 Composer 获取指定Tx_id(transactionId)的信息
  12. KnockoutJS 实例
  13. 【软件工程】——项目开发计划
  14. Syntax error, annotations are only available if source level is 1.5 or greater错误
  15. cmdb 指南_无限供应商制造商指南
  16. u盘安装LINUX键盘失灵,U盘装Win7系统进入pe后鼠标键盘失灵不能用怎么办?
  17. 霍兰德人格分析雷达图——python实现
  18. Dell R410 broadcom网卡驱动更新失败
  19. 数电6_1——时序逻辑电路概述(很久整理的,没有下文)
  20. EastWave应用案例:同轴线仿真

热门文章

  1. 如何在微信服务号每天推送消息?
  2. 前端js奇淫技巧(一)
  3. WMI基础知识(整理中)
  4. apk 打包 java出错_AndroidApk混淆编译时,报告java.io.IOException...错误解决办法
  5. 哪些企业网络场景会用到云专线?
  6. 德语环境下浮点数精度错乱的解决办法
  7. 行业生命周期理论(转载)
  8. 逻辑回归L1与L2正则,L1稀疏,L2全局最优(凸函数梯度下降)
  9. MFC Windows 程序设计(3)
  10. 客户主数据-供应商主数据-业务伙伴