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次,每次计算结果都一样,只要算一个就行了,所以额外的开销非常大,用非递归实现效率好多了,
相关文章推荐
- 继续算法课的学习!归并排序的模版函数的递归实现(merge函数用两个来实现,记得检查左右边界指针的范围哦)
- 函数和递归(组合数,孪生素数,用指针实现变量交换,求解二院一次方程组)
- 求阶乘 递归实现和非递归实现
- 二叉查找树带父节点指针的创建,销毁,查找,删除,插入,找前驱后继,找最小值最大值(递归和非递归的实现)
- C和指针之函数之递归实现厄密多项式
- C和指针之函数之归以字符形式按顺序打印数字的每位数字(递归和非递归)
- 递归和非递归分别实现求n的阶乘
- C语言实现-递归和非递归求第n个斐波那契数
- 利用递归方法实现一个函数,该函数能够实现n的阶乘,即 n! = n*(n-1)*…*3*2*1
- 递归和非递归分别实现求第n个斐波那契数(C语言)
- 阶乘的递归实现和非递归实现
- 递归和非递归分别实现求第n个斐波那契数
- 一只程序猿的养成日记 第一章 第十节 递归和非递归分别实现求第n个斐波那契数
- 递归和非递归分别实现求n的阶乘
- C和指针之函数递归实现把amount表示的值转换为单词形式written_amount(unsigned int amount,char *buffer)
- 单链表倒置,给你一个头指针,用递归与非递归的方法分别实现;
- 一只程序猿的养成日记 第一章 第十五节 递归和非递归分别实现求n的阶乘
- C语言程序-递归和非递归分别实现求n的阶乘
- 3.1题目: 利用递归方法实现一个函数,该函数能够实现n的阶乘,即 n! = n*(n-1)*…*3*2*1;
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度