大量函数递归 - C ++

时间:2012-02-10 05:48:45

标签: c++ recursion

我有一个需要不同类型迭代的项目。一个是5000的char数组上的函数递归。在50次调用之后它将崩溃,假设从堆栈溢出。不知道怎么解决这个问题。

void functionLoop(int loopInt)
{
#ifdef ___EXSTR_H___
#undef ___EXSTR_H___
#endif
#include "exstr.h"

    ofstream fout;
    fout.open("output.txt");

    int arrayLength =  sizeof ( example_strings ) / 4; // arrayLength = 5000.
    char *stringArray = example_strings[loopInt];
    int charCount = 0;
    while( *stringArray != 0 )
    {
        stringArray++;
        charCount++;
    }
    cout << loopInt + 1 << ": " << charCount << ": " << example_strings[loopInt] << endl;
    loopInt++;
    if(loopInt < arrayLength)
    {   
        functionLoop(loopInt);      
    }
}

编辑:

我清理了很多代码,删除了所有变量,将头文件移动到参数,并获得了大约4500次迭代,但是在4546之后它仍然崩溃。这是更新后的代码:

void functionLoop(char * example_strings[], ofstream &outputFile, int counter)
{     
    outputFile << counter + 1 << ": " << strlen(example_strings[counter]) << ": " << example_strings[counter] << endl;
    counter++;

    if(counter < ARRAY_SIZE)
    {   
        functionLoop(example_strings, outputFile, counter);      
    }
}

感谢所有帮助过的人。

4 个答案:

答案 0 :(得分:1)

以下是我在代码中可以看到的一系列问题。

1)头文件包含在函数内部,所以如果你的头文件中有一些变量/数组声明,(我猜你的example_strings在那个头文件中),它将成为你函数的局部变量实例,并且将占用堆栈空间。随着递归的继续,很快就会导致Stack OverFlow。

2)为什么要在每次递归调用时打开文件“output.txt”?因此,在每次通话中,您都会一次又一次地打开相同的故障。将它移到某个地方只打开一次。

所以,这是我的建议(简要): 1)将标题#include "exstr.h"移出您的功能。

2)不要在每次递归调用时打开相同的文件。

  • 微内核

答案 1 :(得分:0)

如果由于递归导致你的堆栈用完,则删除递归调用并使用迭代方法。很容易改变你的代码来做到这一点。在loopInt上做一个while / for循环,并检查数组[loopInt]的字符串长度。

提示
您可以使用strlen来查找字符串的长度,您不需要手动执行该循环:while(* stringArray!= 0)

伪代码:

i=loopInt
while i<arrayLength {
    print strlen(exampleString[i], exampleString[i])
}

请编辑我的帖子。我在平板电脑上。

答案 2 :(得分:0)

尝试:

void functionLoop(int loopInt) 
{ 
#ifdef ___EXSTR_H___ 
#undef ___EXSTR_H___ 
#endif 
#include "exstr.h" 

    ofstream fout; 
    fout.open("output.txt"); 

    int arrayLength =  sizeof ( example_strings ) / 4; // arrayLength = 5000. 
    while (loopInt < arrayLength)
    {
      char *stringArray = example_strings[loopInt]; 
      int charCount = strlen(stringArray);
      stringArray += charCount;
      cout << loopInt + 1 << ": " << charCount << ": " << example_strings[loopInt] << endl; 
      loopInt++; 
    } 
} 

答案 3 :(得分:0)

将数组作为参数传递给函数,即

printLoop(outputFile, example_strings, current_index, max_index);