C ++分段错误中的Heap算法

时间:2014-07-07 14:32:48

标签: c++ algorithm recursion heap permutation

我一直致力于实现堆算法的递归版本。以下是伪代码的链接:http://en.wikipedia.org/wiki/Heap%27s_algorithm

在我到达递归部分之前,一切都很顺利。我知道我还没有交换元素,但我还没有达到那么远。在我使用gcc调试器告知我存在分段错误之前,运行失败而没有显示错误。这是我的代码:

#include <string>
#include <iostream>
using namespace std;

string* permute(int n, string array[2]){
    if (n==1){
        return array;
    }
    else{
        for(int c=1; c<=n;c++){
            permute(n--,array);
        }
    }
}

int main() {
    string array[2]={"a","b"};
    permute(2,array);
    return 0;
}

4 个答案:

答案 0 :(得分:5)

抛开整个实现似乎错误的事实,您遇到的运行时异常的直接原因是您对permute(2,array)的递归调用,最终导致堆栈溢出。这是因为您使用n--而不是--n(或更确切地说,n-1)来调用它。

答案 1 :(得分:2)

尝试permute( --n, array ) 你传递的是2的副本而不是减量

答案 2 :(得分:1)

你必须使用前缀减法:

变化:

 permute(n--,array);

为:

 permute(--n,array);

通过这种方式,您 首先 减少&#39; n&#39;和 然后 调用permute。

在第一种情况下,你永远不会减去并且你有一个无限递归。

答案 3 :(得分:0)

你不应该在你的递归调用中递减n,而是减少预先递减:

permute(--n,array);