Javascript 二叉树
我正在尝试使用javascript来解决这个问题,它正在做一个二进制搜索,重新创建Javascript 二叉树,javascript,arrays,binary-tree,Javascript,Arrays,Binary Tree,我正在尝试使用javascript来解决这个问题,它正在做一个二进制搜索,重新创建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>
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;
}
您需要返回
false
,而不是空数组。空数组解析为true
,这意味着您只迭代左分支
(顺便说一句,如果零件返回,则不需要其他零件。)
功能go(a、b){
//var tt=readline().split(“”);
//var a=parseInt(tt[0]);
//var b=parseInt(tt[1]);
功能f(arr、x、b){
如果(x>b){
返回false;//否[!!!
}
如果(x==b){
返回加(arr,x);
}
返回(f(_add(arr,x),(2*x),b)| f(_add(arr,x),(10*x+1),b));
}
函数_添加(数组,x){
var_arr=array.slice();
_arr.push(x);
返回_arr;
}
返回f([],a,b);
}
控制台日志(go(2162));
控制台日志(go(4,42));
控制台日志(go(10040021))代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
两个问题:
真实性。在javascript中,falsy值是false
,null
,未定义的,0
,NaN
和空字符串(“
)。所有其他值均为真
您正在为基本情况返回一个数组:
return [];
所以这永远是真的
|
操作符的工作方式。|
操作员短路。因此,如果左边的值是truthy,它将返回它,而不会计算右边的代码
你写道:
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作为基本情况,而不是空数组(这可能会破坏算法,我不知道,因为我不知道算法)。谢谢您的帮助,我从来没有注意到[]在javascriptA中是一个真值问题:为什么([]==true)会返回false?对此我不确定,但[]
确实是真的:如果([]{console.log('HA')}
打印“HA”。=
运算符可能正在触发某些类型转换。请注意,|
操作符的行为类似于if
而不是=
:[]| |“mango”
返回[]
而不是“mango”,并且[]| console.log('HA')
不打印任何内容,而[]&&console.log('HA')
打印“HA”,这很有趣,javascript中的==
是如何工作的the@MichaelLee:见: