我通常用 java 编程,最近看了一些 c 代码。 我遇到了这个程序,但我不知道这个指针是如何工作的。 我知道指针存储地址,但无法通过程序完成。 请告诉我输出是如何变成 8 的?
#include <stdio.h>
int fun(int n, int * f_p) {
int t, f;
if (n <= 1) {
*f_p = 1;
return 1;
}
t = fun(n - 1, f_p);
f = t + *f_p;
*f_p = t;
return f;
}
int main() {
int x = 15;
printf("%d\n", fun(5, &x));
return 0;
}
最佳答案
这里有一个递归函数,它计算斐波那契数列的第 i 个元素(从 0
开始索引)。每次递归迭代返回两个值:第 i 个斐波那契数和第 (i-1) 个(前一个)斐波那契数。由于 C 中的函数只能返回一个值(好吧,除非您使用结构作为返回类型),另一个值 - 先前的斐波那契数 - 通过指针参数 f_p
返回给调用者。
因此,当您调用 fun(5, &x)
时,该函数将返回 8
,这是第 5 个斐波那契数,它还会放置 5
转换为 x
,这是前一个(第 4 个)斐波那契数。
请注意,x
的初始值无关紧要。那个15
在这个程序中没有起到任何作用。显然,它就像一条红鲱鱼。
如果您知道什么是斐波那契数列,您就会知道该数列的下一个元素是前两个元素的总和。这就是编写函数以将序列的两个元素“返回”给调用者的原因。您可能不关心顶级调用者(即 main
)中的先前值,但嵌套递归调用确实需要它来计算下一个数字。剩下的就很简单了。
关于c - C中的指针与递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26287094/