越野车二叉树

时间:2016-11-30 09:03:25

标签: javascript arrays binary-tree

我正在尝试使用javascript来解决codeforces 737A,这是一个二进制搜索,将2*x10*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;
}

2 个答案:

答案 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)

两个问题:

  1. 感实性。在javascript中,虚假值为falsenullundefined0NaN和空字符串("")。所有其他值都是真的。

    您正在为基本案例返回一个数组:

    return [];
    

    所以这将永远是真的。

  2. ||运算符的工作原理。 ||运算符短路。因此,如果左手值是真实的,它将返回它并且不评估右手代码。

    您写道:

    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个案。

  3. 要使代码工作,您需要编写一个函数来选择一个非空数组而不是使用||运算符,或者使f()返回false或者为基本情况返回0而不是空数组(可能会或可能不会破坏算法,我不知道,因为我不知道算法)。