终端和非终端递归调用
Terminal && Non Terminal recursive call
有人能告诉马终端递归调用和非终端递归调用之间的区别吗??
我写了
#include <iostream>
int factorial(int n)
{
if (n==0 || n==1)
return 1;
else
return n*factorial(n-1);
}
当递归调用是函数中要完成的最后一个操作时,会发生终端递归。
当从递归调用返回时有额外的工作要做时,就会发生非终端递归。
您的示例是非终端的,因为从递归调用返回后,仍有一个乘法要做(n*
)。最后一行:
return n*factorial(n-1)
实际上相当于:
int temp = factorial(n-1);
return temp * n;
您可以将factorial()
函数更改为带有附加参数的终端:
int factorial_x(int n, int f)
{
if (n==0 || n==1)
return f;
else
return factorial_x(n - 1, f * n);
}
int factorial(int n)
{
return factorial_x(n, 1);
}
递归调用:
return factorial_x(n - 1, f * n);
相当于:
int n2 = n - 1;
int f2 = f * n;
return factorial(n2, f2);
正如您所看到的,现在乘法是在递归调用之前,而不是在递归调用之后。在递归调用之后,什么都没有,只有return
,所以这实际上是尾部递归。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在linux终端中同时编译和运行c++代码
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- Qt:调用终端+脚本的QProcess
- 终端和非终端递归调用
- 当从终端编译c++文件时,clang: error: linker命令失败,退出代码为1(使用-v查看调用)
- C++调用getenv("LINES")或getenv("COLUMNS")在Xcode中运行良好,在终端中运行时会出现段错误
- 从xcode c++程序终端调用OSX包