这个阶乘程序内部发生了什么?
what is happening inside this factorial program?
当我编写以下代码时,我只是在使用递归处理阶乘问题。
我知道我可以直接返回阶乘,但是我创建了一个变量结果并编写了下面的代码。 现在我想知道的是,我还没有创建N(我想计算阶乘的No.(。过程中的结果变量??因为每当调用我的函数阶乘时,都会创建结果变量,并且每个结果变量都会保留一些值。
long long factorial(long long param) {
long long result;
if (param == 1) return 1;
else {
result = param * factorial(param - 1);
}
return result;
}
我知道这不是一个好的代码,我没有想到这会给我写答案,但令我惊讶的是,我想知道这个程序发生了什么。
你的函数是一个递归函数。您可以在此处阅读有关递归和递归调试的信息:
https://www.programiz.com/cpp-programming/recursion
https://beginnersbook.com/2017/08/cpp-recursion/
首先:你的函数无法确定 0!
其次,是的,如果没有编译器的任何优化,您的程序将占用不必要的资源。该函数被调用 n 次,因此堆栈增长 n 次。在每个堆栈帧中,将在堆栈上推送一个临时结果。
但是,由于该程序非常小,因此很可能最小的编译器工作将在发布版本中对其进行优化。
也可以在不增加堆栈的情况下进行递归:以永远不会涉及临时值的方式定义阶乘。如果 f(n, a( := n == 0 ?a : f(n-1, n*a( 然后阶乘(n( := f(n, 1( 这种递归只是保留一个累积的结果,这是函数式编程的一个很好的例子。堆栈不需要增长。
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 这C++代码中发生了什么C++(指数函数)
- 哪种方式更快?究竟发生了什么,我们没有看到什么?
- 从"LLONG_MAX 秒"构造 std::chrono::毫秒变量时发生了什么?
- 这个片段中关于 n 在 pc[i] 中的表示发生了什么
- istringstream,num1 和 num2 在这里发生了什么?
- 究竟发生了什么,我们需要在 c++ 中双重调度/访客
- 我是否能够确定在部署一个程序后发生了什么,我在数组末尾写入?
- 这个阶乘程序内部发生了什么?
- C++ - *(int**) 地址?这里发生了什么?
- C++用用户输入在循环中填充 char 数组:输入整个字符串时到底发生了什么?
- 让对象知道它创建的 show 函数中发生了什么
- 这里的矢量数组发生了什么?
- 增加顶级常量指针时发生了什么
- 当另一端将其关闭时,插座发生了什么
- C :我堆栈顶部发生了什么
- 此递归中发生了什么?我需要仅使用递归/无循环来计算和备份
- 这个 std::vector 构造函数中发生了什么
- 编译器认为 int 是一个字符串.发生了什么事情
- 无法运行简单的 std::async 和 std::future 测试程序。错误:"has initializer but incomplete type."发生了什么?