C中的递归问题

Posted

技术标签:

【中文标题】C中的递归问题【英文标题】:Recursion problems in C 【发布时间】:2020-05-30 19:18:19 【问题描述】:

我正在用 C 语言开发一个字谜求解器。遇到一个问题,求解器将正确返回前几个字谜,但是对于超过 2 个单词的字谜,它开始进入无限循环。

例子:

我在 anagram 求解器中输入“team sale rest”,它以 teamster ale 和其他一些响应。然后当它到达发布时,它进入一个无限循环,在其中打印“releases am matt”“releases am am matt”等。

这里是代码库:

//recursively find matches for each sub-word
int findMatches(char string[], char found_so_far[])

    printf("String entering function: %s\n", string);
    int string_length = strlen(string);
    int_char_ptr *results = getPowerSet(string, string_length);
    if(!results)
        return 2;
    // selects length of subset, starting with the largest
    for (int i = string_length - 1; i > 0; i--)
    
        // iterates through all the subsets of a particular length
        for(int j = 0; j < results->count[i]; j++)
        
            word_array *matches = NULL;
            // check words against dictionary
            matches = dictionary_check(results->table[i][j]);
            if (matches)
            
                // iterate through matches
                for(size_t k = 0; k < matches->size; k++)
                
                    int found_length;
                    // find out length of string needed for found
                    if (strcmp(found_so_far, "") == 0)
                        found_length = strlen(matches->arr[k]) + 1;
                    else
                        found_length = strlen(found_so_far) + strlen(matches->arr[k]) + 2;
                    char found[found_length];

                    // on first passthrough, copy directly from matches
                    if (strcmp(found_so_far, "") == 0)
                        strcpy(found, matches->arr[k]);
                    else
                        sprintf(found, "%s %s", found_so_far, matches->arr[k]);
                    char tempstr[string_length];
                    strcpy(tempstr, string);
                    char *remain = get_remaining_letters(tempstr, results->table[i][j]);
                    // if there are no letters remaining
                    if (strcmp(remain, "") == 0)
                    
                        printf("MATCH FOUND: %s \n", found);
                        // alternatively, could store strings to array
                    
                    else
                    
                        findMatches(remain, found);
                    
                
            
        
        free(results->table[i][results->count[i] - 1]);
        free(results->table[i]);
    
    return 0;

我的阅读方式(我显然遗漏了一些东西)是它应该尝试匹配所有匹配项,如果它不能,它应该移动到找到的下一个字母子集。

我尝试过使用调试器,但无法押韵或原因。

【问题讨论】:

这个函数调用本身可能有错误的东西。我们没有这些东西的代码,所以即使有人试图为你调试,他们也做不到。您需要缩小问题范围。您在自己的调试过程中发现了什么? 感谢马丁的回复。绝对是我下次发帖时会记住的事情!当然,一旦我发布了这个,经过几天的调试尝试,我最终发现了这个问题。 get_remaining_letters 使用原始结果->table[i][j] 并删除了字母。这将为下一次迭代留下一个空字符串,并导致它无法按预期执行。通过将字符串复制到该函数内的临时字符串来修复。 【参考方案1】:

正如上面评论中提到的:

get_remaining_letters 使用原始结果->table[i][j] 并删除了字母。这将为下一次迭代留下一个空字符串,并导致它无法按预期执行。通过将字符串复制到该函数内的临时字符串来修复。

【讨论】:

以上是关于C中的递归问题的主要内容,如果未能解决你的问题,请参考以下文章

C 中的递归练习

C中的二叉树 - 递归

C中的递归和返回语句

C中的内存优化递归调用

打印 C 中的递归数

C++11 中的递归 lambda 函数