Javascript 为什么分段树算法不能正常工作?

Javascript 为什么分段树算法不能正常工作?,javascript,Javascript,这是一个段树算法问题: 第一次在构造函数中初始化方法并使用它时,我不知道为什么会出错 Error : function build_tree(arr, tree, node, start, end){ RangeError: Maximum call stack size exceeded update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val); 更新: 在原型上找不到此函数 update_tre

这是一个段树算法问题:

第一次在构造函数中初始化方法并使用它时,我不知道为什么会出错

Error : 
    function build_tree(arr, tree, node, start, end){
    RangeError: Maximum call stack size exceeded
    update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);

更新: 在原型上找不到此函数

update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);
    ^
ReferenceError: update_tree is not defined
update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);
    ^
ReferenceError: update_tree is not defined
更新:
sumRange
返回未索引

以下代码:

/**
 * @param {number[]} nums
 */
var NumArray = function (nums) {
    if(nums.length === 0) return;
    this.nums = nums;
    this.size = this.nums.length;
    this.tree = [];

    build_tree(this.nums, this.tree, 0, 0, this.size - 1);

    function build_tree(arr, tree, node, start, end){
        if (start == end) {
            tree[node] == arr[start];
        } else {
            let mid = parseInt((start + end) / 2);
            let left_node = 2 * node + 1;
            let right_node = 2 * node + 2;
            build_tree(arr, tree, left_node, start, mid);
            build_tree(arr, tree, right_node, mid+1, end);
            tree[node] == tree[left_node] + tree[right_node];
        }
    }
};

/** 
 * @param {number} i 
 * @param {number} val
 * @return {void}
 */
NumArray.prototype.update = function (i, val) {

    update_tree(this.nums, this.tree, 0, 0, this.size - 1, i, val);

   function update_tree(arr, tree, node, start, end, idx, val){
        if (start == end) {
            arr[idx] = val;
            tree[node] = val;
        } else {
            let mid = parseInt((start + end) / 2);
            let left_node = 2 * node + 1;
            let right_node = 2 * node + 2;
            if (idx >= start && idx <= mid) {
                update_tree(arr, tree, left_node, start, mid, idx, val)
            } else {
                update_tree(arr, tree, right_node, mid + 1, end, idx, val)
            }
            tree[node] = tree[left_node] + tree[right_node];
        }
    }
};

/** 
 * @param {number} i 
 * @param {number} j
 * @return {number}
 */
NumArray.prototype.sumRange = function (i, j) {

    return query_tree(this.nums, this.tree, 0, 0, this.size - 1, i, j);

    function query_tree(arr, tree, node, start, end, L, R) {
        if (R < start || L > end) {
            return 0;
        } else if (start == end) {
            return arr[start];
        } else if (L <= start && end <= R) {
            return tree[node];
        } else {
            let mid = parseInt((start + end) / 2);
            let left_node = 2 * node + 1;
            let right_node = 2 * node + 2;
            let sum_left = query_tree(arr, tree, left_node, start, mid, L, R);
            let sum_right = query_tree(arr, tree, right_node, mid + 1, end, L, R);
            return sum_left + sum_right;
        }
    }
};

var obj = new NumArray([1, 3, 5]);

console.log(obj.sumRange(0, 2));
console.log(obj.update(1, 2))
console.log(obj.sumRange(0, 2));
更新:
sumRange
返回未索引

我试图使用
IIFE
,但不能使用递归

为什么?


你能帮我吗?

构建树中
如果(开始==结束)
开始总是
0
,结束永远不会到达
0
,因为
让中间=(开始+结束)/2
并将
mid
传递到
build_tree
您可以尝试
let mid=parseInt((开始+结束)/2)@Taki已经添加了parseInt,我想知道为什么ReferenceError:query\u树不可用defined@Amadeus我添加了parseInt,我想知道为什么ReferenceError:query_树没有准确地定义我向您展示的内容。您应该使用
=
并在使用前定义它