这个析因程序内部发生了什么?

时间:2019-08-17 10:08:58

标签: c++ c factorial

当我编写以下代码时,我只是使用递归来处理阶乘问题。

我知道我可以直接返回阶乘。但是我创建了一个变量结果并编写了以下代码。 现在我想知道的是,我还没有创建n(要计算的阶乘)否。在过程中的结果变量?因为每当调用我的函数阶乘时,都会创建结果变量,并且每个结果变量都将保留一些值。

long long factorial(long long param) { 
    long long result;
    if (param == 1)  return 1;
    else {
        result = param * factorial(param - 1);
    }
    return result;
}

我知道这不是一个好的代码,而且我不认为这会给我书面答复。但是,令我惊讶的是。我想知道程序中正在发生什么。

2 个答案:

答案 0 :(得分:1)

您的函数是递归函数。您可以在此处阅读有关递归和递归调试的信息:

https://www.programiz.com/cpp-programming/recursion

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

答案 1 :(得分:0)

首先:您的函数无法确定0!

第二,是的,如果没有编译器的任何优化,您的程序将占用不必要的资源。该函数被调用n次,因此堆栈增长n次。在每个堆栈帧中,将临时结果压入堆栈。

但是,由于程序很小,很可能只需很少的编译器工作就能在发行版本中对其进行优化。

也可以在不增加堆栈的情况下进行递归:以这样的方式定义阶乘,从而永远不会涉及临时值。如果f(n,a):= n == 0? a:f(n-1,n * a)然后阶乘(n):= f(n,1) 这种递归只是保持累积的结果,这是函数式编程的一个很好的例子。堆栈不必增长。