【问题标题】:Iterative method to Recursive method C Language迭代方法到递归方法 C 语言
【发布时间】:2020-08-18 13:25:24
【问题描述】:

我试图将这个已经在我的程序中工作的方法转换为递归方式。因为我被要求这样做。问题是我已经尝试过见下文,但是在我的方法中,当尝试将方法值添加到他的位置时,这个值是一个很大的数字并创建分段。

这是我的迭代方法:

int researchList_getPosByCountry(tResearchList* list, tCountry *country) {

// Check preconditions
    assert(list != NULL);

    tResearchListNode *prev = NULL;
    int pos;


    // check if is an empty list 
    if (researchList_empty(list)) {
        pos = -1;
    }
    else{

        pos = 1;
        prev = list->first;
        while ((prev != NULL) && !country_equal(prev->e->country, country) ) {
            prev = prev->next;
            pos++;
        }
    }

    if (prev == NULL) {
        pos = -1;        
    }

    return pos;
}

这是我的递归方法:

 assert(list != NULL);

    tResearchListNode *prev;
    int pos;


    // check if is an empty list 
    if (researchList_empty(list)) {
        pos = -1;
    }
    else{
        pos = 1;
        prev = list->first;
        if ((prev != NULL) && !country_equal(prev->e->country, country) ) {

            prev = prev->next;
          pos = pos + researchList_getPosByCountry(list, country); //Debugging the segmentation is here
        }


    }

【问题讨论】:

  • 显然你有两个结构,一个用于列表,一个用于节点。递归函数必须在节点上递归,而不是列表:您有三种情况:(1)节点为空:返回“未找到”; (2) 节点有你要查找的数据:返回位置; (3) 递归到node->next。我认为您的实现递归地调用列表中的函数并且总是从头开始。

标签: c loops recursion


【解决方案1】:

你会得到一个无限的递归,因为你调用researchList_getPosByCountry总是从列表的开头开始;一次又一次……

我建议您引入第二个(然后递归使用)函数,该函数使用相应的下一个节点调用自身并返回 (a) 如果未找到该节点,则可能返回“最大”负数(从而在调用中转换任何中间结果堆栈成负数),或返回 0 表示“找到国家,计数到目前为止”,或“1 + 下一次尝试”继续计数。递归部分如下所示;然后你需要从你的int researchList_getPosByCountry(tResearchList* list, tCountry *country) 调用这个并相应地解释否定结果:

int researchList_getPosByCountry(tResearchListNode* node, tCountry *country) {
    if (!node) {
       return INT_MIN;
    } else if (countryEqual(...)) {
       return 0;
    } else {
       return 1 + researchList_getPosByCountry(node->next,country);
    }
}

【讨论】:

  • 嗨,正如你提到的,我创立的唯一解决方法是使用具有两个索引的辅助递归函数。问候
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 2021-12-24
  • 2015-07-06
  • 2012-02-20
相关资源
最近更新 更多