请向我解释为什么这个函数不是递归的

Please explain to me why this function is not recursive

本文关键字:函数 递归 解释 为什么      更新时间:2023-10-16

我的导师坚持认为我没有写递归函数,但没有解释为什么我的函数不是递归的。我已经研究递归函数数周了,但显然仍然不明白递归函数的构成。据我所知,递归函数是使用对原始函数的匹配函数调用来调用自身的任何函数。

伪示例:

bool foo(int someInt){
++someInt;
return foo(someInt);
}

以下是我的最新功能。

int LinkedList::sumR(int intIn){
    if(intIn == 0){
    if(head != NULL)
    curr = head;
    }  
    if (head != NULL){
        if(curr->next != NULL){
            intIn = intIn + curr->data;
            curr = curr->next;
            return sumR(intIn);
        }  
        else
        {              
            intIn = intIn + curr->data;
        }
    return intIn;
    }
return intIn;
}

在这一点上,我完全迷失了。

更新

在给我的老师发了电子邮件后,他们回复说,要使函数递归,它必须接受类或结构指针作为参数(就他们而言,我猜)。

没有数学定义很难说,但我认为你的导师期望的是你把它作为一个纯函数实现,而不是依赖于函数外部的任何状态(例如你的变量名为 cur )。

例如,取阶乘函数 (5! = 5 x 4 x 3 x 2 x 1)

int fact(n) = { 1 if n == 1 else n * fact(n-1) }

如果我按照您实现上述列表总和的方式实现这一点

prod = 1
fact(n) {
    if (n > 1) {
       prod *= n;
       fact(n - 1);
    }
}

第二个实现依赖于副作用(全局状态变量prod)。

如果你LinkedList是节点列表LinkedList::Node(你的变量curhead指向什么),那么尝试将你的函数重新定义为:

int LinkedList::sumR(LinkedList::node cur);

并用sumR(list->head);调用它

任何递归方法都将包括以下三个基本元素

  1. 用于停止或继续递归的测试。
  2. 终止递归的结束情况
  3. 继续递归的递归调用。

您的第一个示例缺少#2

https://beginnersbook.com/2017/08/cpp-recursion/