C和指针之函数之实现阶乘和斐波那契数(递归和非递归)

来源:互联网 发布:金贵软件怎么样 编辑:程序博客网 时间:2024/06/09 22:17

1、问题

实现阶乘和斐波那契数(递归和非递归)



2、代码实现

#include <stdio.h>int num = 0;//递归实现斐波那契数// n <=2, f(n) = 1, n > 2 f(n) = f(n - 1) + f();long fibonacci(int n){    //计算fibonacci(3)计算了多少次    if (n == 3)        num++;    if (n <= 2)    {        printf("num is %d\n", num);        return 1;    }    return fibonacci(n - 1) + fibonacci(n - 2);}//非递归实现斐波那契数long fibonacci1(int n){    long result = 1, pre_result = 1, next_pre_result;    while (n > 2)    {        n -= 1;        next_pre_result = pre_result;        pre_result = result;        result = pre_result + next_pre_result;    }    return result;}//递归实现n的阶乘//n <= 1, f(n) = 1, n > 1 f(n) = n * f(n - 1);long factorial(int n){     if (n == 1)        return 1;     return n * factorial(n - 1);}long factorial1(int n){     int result = 1;     while (n > 1)     {         result *= n;         n -= 1;     }     return result;}int main(){    long result = fibonacci(10);    printf("fibonacci result is %ld\n", result);    long result1 = factorial1(3);    printf("factorial result is %ld\n", result1);    return 0;}






3、运行结果

num is 21fibonacci result is 55factorial result is 6





4、总结

递归函数会把参数压倒堆栈中,为局部变量分配内存空间,有时开销非常大,经过上面的测试,递归实现斐波拉契数f(10)的时候,f(3)求了21次,求f(30)的时候,f(3)运行了317811次,每次计算结果都一样,只要算一个就行了,所以额外的开销非常大,用非递归实现效率好多了,
阅读全文
0 0
原创粉丝点击