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

Heap's Algorithm in C++ segmentation fault

本文关键字:算法 分段 错误 C++      更新时间:2023-10-16

我一直致力于实现堆算法的递归版本。下面是伪代码的链接: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;
}

撇开整个实现看起来是错误的这一事实不谈,您正在经历的运行时异常的直接原因是您对permute(2,array)的递归调用,它最终导致堆栈溢出。发生这种情况是因为您使用n--而不是--n(或者更准确地说,n-1)调用它。

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

必须使用前缀减法:

改变:

 permute(n--,array);

:

 permute(--n,array);

这样,首先递减'n',然后然后调用permute。

在第一种情况下,你从不减法,你有一个无限递归。

你不应该在递归调用中对n进行后递减,而应该进行预递减:

permute(--n,array);