我有一个关于递归函数的查询。这是我的计划。
#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
答案 0 :(得分:5)
让我们检查一下fun()
的呼叫顺序,我们呢?
参数值为3
,从main()
x = fun(3)
f = 2 + fun(2);
f = 2 + fun(1);
现在,让我们按相反的顺序检查返回值。
fun(1)
会返回1
,fun(2)
会返回2 + 1
或3
,fun(3)
会返回2 + 3
或5
这是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).