您的位置:首页 > 其它

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

2017-11-07 01:47 274 查看

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 21
fibonacci result is 55
factorial result is 6





4、总结

递归函数会把参数压倒堆栈中,为局部变量分配内存空间,有时开销非常大,经过上面的测试,递归实现斐波拉契数f(10)的时候,f(3)求了21次,求f(30)的时候,f(3)运行了317811次,每次计算结果都一样,只要算一个就行了,所以额外的开销非常大,用非递归实现效率好多了,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐