Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅使用1个递归调用C的斐波那契序列_C_Recursion_Fibonacci - Fatal编程技术网

仅使用1个递归调用C的斐波那契序列

仅使用1个递归调用C的斐波那契序列,c,recursion,fibonacci,C,Recursion,Fibonacci,尝试使用递归函数计算斐波那契数,但我的代码使用了2个递归调用。有可能只用一个就可以做到吗?将n-1的fib编号保存到一个数组或类似数组中,然后在函数末尾添加编号,这样行吗 #include <stdio.h> #include <stdlib.h> #include <assert.h> int fib(int n) { assert(n >= 0); if (n > 1) return fib(n - 1) +

尝试使用递归函数计算斐波那契数,但我的代码使用了2个递归调用。有可能只用一个就可以做到吗?将
n-1
的fib编号保存到一个数组或类似数组中,然后在函数末尾添加编号,这样行吗

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int fib(int n) {
    assert(n >= 0);
    if (n > 1) 
        return fib(n - 1) + fib(n - 2);
    else if (n == 1)
        return 1;
    else 
        return 0;
}

int main(void) {
    int n, f;
    printf("the nth number: ");
    scanf("%d", &n);
    f = fib(n);
    printf("%d \n", f);
    return 0;
}

#包括
#包括
#包括
整数fib(整数n){
断言(n>=0);
如果(n>1)
返回fib(n-1)+fib(n-2);
else如果(n==1)
返回1;
其他的
返回0;
}
内部主(空){
int n,f;
printf(“第n个数字:”);
scanf(“%d”和“&n”);
f=fib(n);
printf(“%d\n”,f);
返回0;
}
函数“fib”必须返回2个值

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void fib(int n, int * ra, int * rb) {
    assert(n>=0);
    if (n>1) {
        int ya,yb;
        fib (n-1, &ya, &yb);
        *rb = ya;
        *ra = ya + yb;
    } else if (n==1) {
        *ra = 1;
        *rb = 0;
    } else {
        *ra = 0;
        *rb = 0;
    }
}
int main(int argc, const char * argv[]) {
    int n;
    printf("the nth number: ");
    scanf("%d",&n);
    int ya,yb;
    fib(n, &ya, &yb);
    printf("%d \n", ya);
    return 0;
}
#包括
#包括
#包括
无效fib(整数n,整数*ra,整数*rb){
断言(n>=0);
如果(n>1){
int-ya,yb;
fib(n-1,&ya,&yb);
*rb=ya;
*ra=ya+yb;
}else如果(n==1){
*ra=1;
*rb=0;
}否则{
*ra=0;
*rb=0;
}
}
int main(int argc,const char*argv[]{
int n;
printf(“第n个数字:”);
scanf(“%d”和“&n”);
int-ya,yb;
fib(n,ya,yb);
printf(“%d\n”,ya);
返回0;
}

以下方法似乎有效:

int fib_in(int n, int cur, int prev) {
    if (n == 1 || n == 2) {
        return cur;
    }
    return fib_in(n - 1, cur + prev, cur);
}
int fib(int n) {
    fib_in(n, 1, 1);
}