请向我解释为什么这个函数不是递归的
Please explain to me why this function is not recursive
我的导师坚持认为我没有写递归函数,但没有解释为什么我的函数不是递归的。我已经研究递归函数数周了,但显然仍然不明白递归函数的构成。据我所知,递归函数是使用对原始函数的匹配函数调用来调用自身的任何函数。
伪示例:
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
(你的变量cur
和head
指向什么),那么尝试将你的函数重新定义为:
int LinkedList::sumR(LinkedList::node cur);
并用sumR(list->head);
调用它
任何递归方法都将包括以下三个基本元素:
- 用于停止或继续递归的测试。
- 终止递归的结束情况。
- 继续递归的递归调用。
您的第一个示例缺少#2
https://beginnersbook.com/2017/08/cpp-recursion/
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 复制构造函数中的递归调用
- 为什么编译器将其解析为函数指针而不是递归调用?
- 此递归函数的每次迭代的值存储在哪里?
- 在 C++14 中使用通用 lambda 函数递归
- 大量函数递归-C++
- 用内部类函数递归地添加数组数
- 函数递归 C++ 的最大数量