0

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

4 回答 4

5

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

于 2014-07-07T14:38:37.330 回答
2

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

于 2014-07-07T14:39:16.187 回答
1

您必须使用前缀减法:

改变:

 permute(n--,array);

到:

 permute(--n,array);

这样,您首先递减“n”,然后调用 permute。

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

于 2014-07-07T14:39:03.827 回答
0

您不应该n在递归调用中后减,而是先减:

permute(--n,array);
于 2014-07-07T14:39:27.933 回答