我正在尝试使用javascript来解决codeforces 737A,这是一个二进制搜索,将2*x
和10*x+1
的树从给定的输入a
重新编译到另一个输入b
,但似乎我的程序只能在2*x
搜索这些节点,而10*x+1
似乎被忽略了。有意思和为什么?感谢。
var tt = readline().split(' ');
var a = parseInt(tt[0]);
var b = parseInt(tt[1]);
print(f([],a,b));
function f(arr,x,b){
if (x>b){
return [];
}else if (x==b){
return _add(arr,x);
}else{
return (f(_add(arr,x),(2*x),b) || f(_add(arr,x),(10*x+1),b));
}
}
function _add(array,x){
var _arr = array.slice();
_arr.push(x);
return _arr;
}
答案 0 :(得分:1)
您需要返回false
而不是空数组。空数组解析为true
,这意味着您只迭代左分支。
(顺便说一句,如果部件返回,则不需要其他部件。)
function go(a, b) {
//var tt = readline().split(' ');
//var a = parseInt(tt[0]);
//var b = parseInt(tt[1]);
function f(arr, x, b) {
if (x > b) {
return false; // no []!!!
}
if (x == b) {
return _add(arr, x);
}
return (f(_add(arr, x), (2 * x), b) || f(_add(arr, x), (10 * x + 1), b));
}
function _add(array, x) {
var _arr = array.slice();
_arr.push(x);
return _arr;
}
return f([], a, b);
}
console.log(go(2, 162));
console.log(go(4, 42));
console.log(go(100, 40021));

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
两个问题:
感实性。在javascript中,虚假值为false
,null
,undefined
,0
,NaN
和空字符串(""
)。所有其他值都是真的。
您正在为基本案例返回一个数组:
return [];
所以这将永远是真的。
||
运算符的工作原理。 ||
运算符短路。因此,如果左手值是真实的,它将返回它并且不评估右手代码。
您写道:
f(_add(arr,x),(2*x),b) || f(_add(arr,x),(10*x+1),b)
因为在所有情况下f()
永远不会返回表达基本上是虚假的东西:
true || f(_add(arr,x),(10*x+1),b)
因此||
运算符永远不会评估10*x+1
个案。
要使代码工作,您需要编写一个函数来选择一个非空数组而不是使用||
运算符,或者使f()
返回false或者为基本情况返回0而不是空数组(可能会或可能不会破坏算法,我不知道,因为我不知道算法)。