c - C中的指针与递归

标签 c pointers recursion

我通常用 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/

相关文章:

c - 如何在c中正确释放()我的malloc

c - 使用 Atmega32 和 At42QT2100 的 SPI

ios - 在 iOS 上使用 ARC 进行内存管理

java - 递归回溯问题 - 数独求解示例

java - 查找链表中倒数第 k 个元素

c - 为什么我的 fork() 没有输出任何东西?

c - 将数组传递给函数未给出正确答案

Javascript - 递归调用

c++ - 这个带有指针函数的 strcpy 有什么问题?

c++ - 如何在 C++ 中创建动态对象列表