带有递归的C指针

3 c recursion pointers

我通常用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;
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 6

你在这里有一个递归函数,它计算Fibonacci序列的第i个元素(索引0).每个递归迭代返回两个值:第i个斐波纳契数和第(i-1)个(前一个)斐波纳契数.由于C中的函数只能返回一个值(好吧,除非你使用struct作为返回类型),另一个值 - 前一个Fibonacci数 - 通过指针参数返回给调用者f_p.

所以,当你调用时fun(5, &x),函数将返回8,这是第5个斐波那契数,它也将被5放入x,这是前一个(第4个)斐波那契数.

注意,初始值x无关紧要.这15在该计划中没有任何作用.显然它就像红鲱鱼一样.

如果你知道Fibonacci序列是什么,你知道序列的下一个元素是前两个元素的总和.这就是编写函数以将序列的两个元素"返回"给调用者的原因.您可能不关心顶级调用者中的先前值(即in main),但嵌套递归调用确实需要它来计算下一个数字.其余的非常简单.