Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 求数学运算的最短序列_Javascript_Algorithm - Fatal编程技术网

Javascript 求数学运算的最短序列

Javascript 求数学运算的最短序列,javascript,algorithm,Javascript,Algorithm,我在数学上试图确定最短的移动序列,以达到理想的数值结果。我有两个函数,都是一个数乘以2,再减去另一个数的值 到目前为止,我已经包括了我的代码,这让我手动调用这两个函数以获得所需的结果;但是,我想帮助您找出使用循环自动执行此操作的逻辑 函数findShortestSequence(编号){ 设左=0; 设右=1; 让我们移动=[]; 常量moveLeft=()=>{ 移动。推动('L'); 左=2*左-右; } 常量moveRight=()=>{ 移动。推动('R'); 右=2*右-左; } 左

我在数学上试图确定最短的移动序列,以达到理想的数值结果。我有两个函数,都是一个数乘以2,再减去另一个数的值

到目前为止,我已经包括了我的代码,这让我手动调用这两个函数以获得所需的结果;但是,我想帮助您找出使用循环自动执行此操作的逻辑

函数findShortestSequence(编号){
设左=0;
设右=1;
让我们移动=[];
常量moveLeft=()=>{
移动。推动('L');
左=2*左-右;
}
常量moveRight=()=>{
移动。推动('R');
右=2*右-左;
}
左移();
左移();
moveRight();
左移();
控制台日志(左、右、移动);
}

findShortestSequence(-11)
我刚才在看-11,并认为11是二进制的1011,这类似于您的手动LLRL解决方案,只是向后看。测试表明,这可能是负数的关键:获得它们的绝对值,然后开始向右移动,直到它变为零。移出1时向左移动,移出0时向右移动。最后一步是向左移动,结果进入
left

然后我只检查了正数,简单地交换动作(因为让它们留在原地会产生负结果),结果似乎比目标高出一个数字。所以我只是从原稿中减去一个,它就开始工作了。当然,这一次的最后一步是右移,结果进入
右移

函数findShortestSequence(编号){
设org=number;
如果(数字){
移动。推动('L');
左=2*左-右;
}
常量moveRight=()=>{
移动。推动('R');
右=2*右-左;
}
如果(组织>=1;
}
其他的
while(数字!=0){
如果(数字和1)向右移动();
else左移();
数量>>=1;
}
log(org,左,右,moves.join(“”),(org==左)| |(org==右));
}

对于(var i=-20;i您可以采用迭代方法,为下一个状态使用堆栈来检查结果

这种方法首先测试最小数量的更改,然后对可能性进行不断增加的计数

函数findShortestSequence(编号){
常数
moveLeft=(左,右,移动)=>[左*2-右,右,[…移动,'L']],
moveRight=(左,右,移动)=>[左,右*2-左,[…移动,'R']],
函数=[moveLeft,moveRight];
变量堆栈=[[0,1,[]],
左,右,移动;
while([left,right,moves]=stack.shift()){
如果(左===个数)返回移动;
functions.forEach(fn=>stack.push(fn(左、右、移动));
}
}
log(findShortestSequence(-11));

。作为控制台包装{max height:100%!important;top:0;}
我想我得出了与tevemadar相同的结论。代码如下:

功能确认(str,n){
设l=0;
设r=1;
设i=0;
while(str[i]){
如果(str[i++]=='L')
l=2*l-r;
其他的
r=2*r-l;
}
如果([l,r]。包括(n))
返回true;
返回false;
}
函数f(n){
如果([0,1]。包括(n))
返回“”;
否则,如果(n>1)
返回(n-1)
.toString(2)
.拆分(“”)
.map(x=>x&1?'R':'L')
.reverse()
.加入(“”);
其他的
返回(-n)
.toString(2)
.拆分(“”)
.map(x=>x&1?'L':'R')
.reverse()
.加入(“”);
}

因为(让我=-11;我是的,我也完全同意我自己的观点,并且发现我的提示很有用(好吧,答案不见了)。
如果不需要验证,生成步骤很简单:

函数getSequence(n){ 如果(n==0 | | n==1)返回“”;
var steps=n这是关于使用位运算符的一个很好的观察。我做了一个小小的修改,就是去掉了
if(org@AnonymousSB),因为我对“look,it is easy”有些怀疑在另一个答案的解释中,我补充了一些关于卡勒布·卢卡斯的答案中发生的事情的想法。我是否误读了它?例如,当我们显然只需要R时,2的任何幂都会包含一个“L”。并且只测试3和-3两个返回值。这怎么可能呢对于正数来说完全是错误的:返回产生相应负数的序列,只是镜像。它从
1
开始无法工作,这将导致一个空序列,因为
right=1
已经(与
0
相同,因为
left=0
已经)@ArsalanAhmed这是一个猜测(很好的措辞:启发式技术),我没有遵循任何形式的方法,只是查看了数字的二进制表示形式中的位,如示例所示。旁注:可能是讨论设计算法理论问题的姊妹站点。虽然至少错误的公认答案完全消失了,但我仍然不明白为什么会这样对于OP来说,接受一个与我不同的答案很重要……我接受这个答案是因为提供的确认功能显示它生成正确的动作,除非我遗漏了什么?我真的很感谢你的努力,以及关于它是二进制的原始观察。这个解决方案对@1490לע更简洁דבקן的答案,并提供了相同的结果。提前交换步骤非常明智。考虑到最大二进制文件的长度为31,我看不出时间复杂性有任何重大问题;但是,您可以使用此
replace
代替
。replace(/0|1/g,match=>match=='0'?步骤[0]:步骤[1])
你如何确定它会终止?@Simone,它会终止,因为