理解递归函数调用

时间:2016-04-26 19:15:09

标签: c function recursion

首次调用factorial()后,n的值将存储在哪里? 当n=1然后返回1时,为什么res在主要功能中等于1

#include<stdio.h>

int factorial(int n)
{
    if(n<=1)
        return 1;
    else
        return n*factorial(n-1); 
}

int main()
{

    int res =factorial(3);
    printf("%d",res) ;
}

3 个答案:

答案 0 :(得分:3)

运行时堆栈总共有四个函数:main(),factorial(3),factorial(2)和factorial(1)。每个都有自己的可变空间。变量 n 三个个实例,每次调用 factorial 一个。

当factorial(1)返回1时,该值不会返回到main(),因为main()不是调用它的:factorial(2)调用它。 实例执行操作2 * 1并返回2.该实例的调用者是factorial(3),它接收2,执行操作3 * 2,并返回值6到< em>它的调用者,main()。

这有助于清除它吗?如果没有,我有两个建议:

(1)在StackOverflow和互联网上搜索此主题;有很多详细的 factorial 的演练示例。

(2)插入 print 语句来跟踪数据流和执行。在factorial中,将计算和返回分开,因此您可以在其间放置 print

catch = factorial(n-1)
result = n * catch
print n, catch, result
return result

答案 1 :(得分:1)

每次调用函数时,其参数和局部变量都会被压入堆栈。在递归函数的情况下,堆栈上将有一组变量用于函数的每次活动调用

在此示例中,对factorial的第一次调用将n设置为3.在该函数中,再次调用factorial,这次将n设置为2它再次调用自己n设置为1.在最后一次调用中,它返回值1.这将返回到先前的调用,其中n为2,然后返回{{ 1}}这是2.此值返回到2 * 1为3的第一次调用,并返回n,其中6为3*2

所以调用堆栈看起来像这样:

main

答案 2 :(得分:1)

n不以全局变量或静态变量的形式存储 - 它存储在堆栈中。调用带参数的函数将参数压入堆栈。

了解运行程序时发生的情况:

  1. factorial(3)被调用(main
  2. n不等于或小于1 factorial(2)时,结果将乘以n(是3)。
  3. n不等于或小于1 factorial(1)时,结果将乘以n(是2)。
  4. n现在等于或小于1时,函数返回1
  5. factorial(2)返回1 * 2
  6. factorial(3)返回2 * 3
  7. res将为6