Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Recursion heapify函数无限递归_Recursion_Heap_Priority Queue_Binary Heap - Fatal编程技术网

Recursion heapify函数无限递归

Recursion heapify函数无限递归,recursion,heap,priority-queue,binary-heap,Recursion,Heap,Priority Queue,Binary Heap,以下是用于基于数组的优先级队列/二进制堆的递归heapify函数 有人能告诉我为什么我要进入无限递归吗 private static void heapify(int i){ if(i < b_heap.size()/2){ int left = i * 2; int right = left++; if(b_heap.get(i).getP() > b_heap.get(left).getP()){

以下是用于基于数组的优先级队列/二进制堆的递归heapify函数

有人能告诉我为什么我要进入无限递归吗

private static void heapify(int i){

    if(i < b_heap.size()/2){

        int left = i * 2;
        int right = left++;

        if(b_heap.get(i).getP() > b_heap.get(left).getP()){
            swap(i,left);
        }
        if(b_heap.get(i).getP() > b_heap.get(right).getP()){
            swap(i,right);
        }

        heapify(i++);
        heapify(i+2);
    }
    else{
        return;
    }
}
private static void heapify(int i){
if(ib_heap.get(左).getP()){
交换(i,左);
}
if(b_heap.get(i).getP()>b_heap.get(right).getP()){
互换(一,右);
}
heapify(i++);
heapify(i+2);
}
否则{
回来
}
}

我修复了无限循环,但是函数仍然没有正确地重设

这是新代码

private static void heapify(int i){
    DecimalFormat df = new DecimalFormat("0.00");
    if(i < b_heap.size()/2){
        int left = i * 2;
        int right = i * 2 +1;

        if(b_heap.get(i).getP() > b_heap.get(left).getP()){
            swap(i,left);
        }
        if(b_heap.get(i).getP() > b_heap.get(right).getP()){
            swap(i,right);
        }
        i++;
        heapify(i);
    }
    else{
        return;
    }
}
private static void heapify(int i){
DecimalFormat df=新的DecimalFormat(“0.00”);
if(ib_heap.get(左).getP()){
交换(i,左);
}
if(b_heap.get(i).getP()>b_heap.get(right).getP()){
互换(一,右);
}
i++;
希皮菲(i);
}
否则{
回来
}
}

我不太确定I参数的作用,但如果给它一个值,左局部变量和右局部变量总是相同的值,因为左++在分配给右后进行计算。类似的事情也发生在heapify(i++)中,在调用之后计算增量。在这一系列事件之后,将发生无限递归。因此,此时您可以做的最有用的事情是添加大量打印语句或在某种IDE中遍历它。我最初倾向于使用print语句,这样我就可以发现是否发生了任何非常明显的事情,如果没有任何可疑的事情,那么就开始遍历代码。I'd:if print I和b_heap.size()在if print I之前打印I和b_heap.size()在if print I中,在第二个if print I中左,在第三个if print I中右,在返回之前使用
I++
调用heapify:这会给heapify
I
然后递增它。您也可以使用
left++
调用heapify。我认为您需要仔细阅读
++
操作符的功能。这与
+1
不同。谢谢大家。错误是i++,我让它正确地递归。然而,它产生的堆仍然是错误的。我是否为最小堆正确实现了开关?