C递归问题

时间:2015-08-10 09:42:11

标签: c recursion

我有一个关于递归函数的查询。这是我的计划。

#include <stdio.h>

int fun(int);

int main(void)
{
    int x;
    int k=3;
    x = fun(k);
    printf("%d\n",x);
    return 0;
}

int fun(int a)
{
    int f;
    if(a == 1) return (1);
    f = 2 + fun(a-1);
    return (f);
}

我在K=3中有一个值STEP-6。在STEP-7中,函数fun(k)将K的值传递给STEP-11 int fun(int a)中的被调用函数。在被调用函数fun(int a)中,递归发生2次,即(3,2)发生a=1的值。稍后在STEP-14中,f的值变为3,因为f = 2 +(fun(1)= 1)。在STEP-16中,它返回到被调用的函数,即fun(int a)=3。应该打印x is 3的值,不太可能。它是 x = 5

4 个答案:

答案 0 :(得分:5)

让我们检查一下fun()的呼叫顺序,我们呢?

参数值为3,从main()

开始
  • x = fun(3)
    • f = 2 + fun(2);
      • f = 2 + fun(1);

现在,让我们按相反的顺序检查返回值。

  1. 最后一次通话fun(1)会返回1
  2. 因此第二个电话fun(2)会返回2 + 13
  3. 最后一次通话fun(3)会返回2 + 35
  4. 这是main()发出的电话。因此,在main()中,x的值为5

答案 1 :(得分:4)

fun(3)的评估如下:

fun(3)
2 + fun(3-1)
2 + fun(2)
2 + 2 + fun(2-1)
2 + 2 + fun(1)
2 + 2 + 1
5

根据您的描述,我认为您对C中的范围(以及一般的递归)有一些误解。在f内为3分配值fun(2)的事实 not 意味着f的值在fun(3)范围内变化 - 它们是完全独立的变量。

答案 2 :(得分:2)

我看到已经发布了许多好的答案。我仍然发布这个答案,这可能会帮助你将来处理一些更复杂的递归。

每当您发现有关递归的任何内容时,请先尝试在笔记本中以数学方式解决它。一个好的方法是从基础案例开始。

函数fun(k)的基本情况为fun(1),返回1。所以从以下开始:

fun(1) = 1 // let's read this, function fun(1) returns 1

现在fun(2)会发生什么?

fun(2) = 2 + fun(1)
       = 2 + 1 // we already calculated fun(1) =1
       = 3
fun(3) = 2 + fun(2)
       = 2 + 3 // we already calculated fun(2) = 3
       = 5

我认为现在有意义x = 5

答案 3 :(得分:2)

对于递归函数,绘制递归树通常是一个好主意,以便更好地可视化正在发生的事情。

  • f(3)将调用f(2),f(2)将进一步调用f(1),这是基本情况。

  • f(1)将返回1.现在f(2)将返回2 + 1 = 3.

  • f(3)现在将返回2 + 3 = 5.

查看下面的递归树:

     |------> returns (2 + 3) = 5
     |
    f(3)<---
     |     | 
     |     | returns (2 + 1)  = 3
    f(2)<---
     |     | returns 1
     |     |
    f(1)----
    (This is the base case. No further recursion. It returns 1).