首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C递归问题

C递归问题
EN

Stack Overflow用户
提问于 2015-08-10 09:42:11
回答 4查看 247关注 0票数 4

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

代码语言:javascript
复制
#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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-10 09:50:23

让我们检查一下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

这就是main()发出的电话。因此,在main()中,x获得5的值。

票数 5
EN

Stack Overflow用户

发布于 2015-08-10 09:50:50

fun(3)的评估如下所示:

代码语言:javascript
复制
fun(3)
2 + fun(3-1)
2 + fun(2)
2 + 2 + fun(2-1)
2 + 2 + fun(1)
2 + 2 + 1
5

从您的描述中,我认为您对C中的作用域(和一般的递归)有一些误解。f被分配给fun(2)中的值3这一事实并不意味着fun(3)范围内的f值会发生变化--它们是完全独立的变量。

票数 4
EN

Stack Overflow用户

发布于 2015-08-10 10:28:02

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

  • f(3)将调用f(2),f(2)将进一步调用f(1),这是基本情况。
  • f( 1 )将返回1,现在f(2)将返回2+1= 3。
  • f(3)将返回2+3= 5。

请查看下面的递归树:

代码语言:javascript
复制
     |------> 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).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31916305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档