斐波那契函数

本文介绍了递归和迭代两种方法实现斐波那契数列,展示了它们在程序结构和性能上的差异。递归虽然使代码更直观,但可能导致栈溢出和效率降低,而迭代则更节省资源。通过C语言代码实例,读者可以对比理解这两种方法在实际编程中的应用。
摘要由CSDN通过智能技术生成

一、递归定义

把一个直接调用自己或通过一系列的调用语句间接地调用自己地函数,称做递归函数

每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出

二、斐波那契数列实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、程序代码

//04斐波那契函数_Fibonacci
#include "stdio.h"
 
int Fbi(int i)  /* 斐波那契的递归函数 */
{
	if( i < 2 )
		return i == 0 ? 0 : 1;  
    return Fbi(i - 1) + Fbi(i - 2);  /* 这里Fbi就是函数自己,等于在调用自己 */
}  
 
int main()
{
	int i;
	int a[40];  
	printf("迭代显示斐波那契数列:\n");
	a[0]=0;
	a[1]=1;
	printf("%d ",a[0]);  
	printf("%d ",a[1]);  
	for(i = 2;i < 40;i++)  
	{ 
		a[i] = a[i-1] + a[i-2];  
		printf("%d ",a[i]);  
	} 
	printf("\n");
	
	printf("递归显示斐波那契数列:\n");
	for(i = 0;i < 40;i++)  
		printf("%d ", Fbi(i));  
    return 0;
}

四、运行结果

在这里插入图片描述

五、迭代和递归区别

1、递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合。

2、迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B。

3、递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。

4、迭代使用的是循环结构,递归使用的是选择结构。递归能使程序地结构更清晰、更简洁、更容易让人理解,从而减少读懂代码地时间。但是大量的递归调用会建立函数地副本,会耗费大量的而时间和内存。时代则不需要反复调用函数和占用额外的内存。

参考资料:《大话数据结构》

经典的斐波那契数列是一个递归定义的序列,其中每个数字都是前两个数字之和。在C++中,你可以通过递归函数来实现这个函数,但是由于递归可能导致大量的重复计算,效率不高。下面是一个简单的递归实现: ```cpp #include <iostream> // 递归版本的斐波那契函数 int fibonacciRecursion(int n) { if (n <= 1) return n; else return fibonacciRecursion(n - 1) + fibonacciRecursion(n - 2); } int main() { int num; std::cout << "请输入一个非负整数: "; std::cin >> num; if (num < 0) std::cerr << "错误! 斐波那契数只对非负整数定义." << std::endl; else std::cout << "斐波那契数列第" << num << "项是: " << fibonacciRecursion(num) << std::endl; return 0; } ``` 不过,对于较大的n值,递归版本可能会非常慢。为了提高性能,你可以使用动态规划或迭代的方式来避免重复计算: ```cpp // 动态规划版本(记忆化搜索) int fibonacciMemoization(int n, std::vector<int>& memo) { if (n <= 1 || memo[n] != -1) return memo[n]; memo[n] = fibonacciMemoization(n - 1, memo) + fibonacciMemoization(n - 2, memo); return memo[n]; } int main() { int num; std::cout << "请输入一个非负整数: "; std::cin >> num; std::vector<int> memo(num + 1, -1); // 初始化一个足够大的数组存储已计算的斐波那契数值 if (num < 0) std::cerr << "错误! 斐波那契数只对非负整数定义." << std::endl; else std::cout << "斐波那契数列第" << num << "项是: " << fibonacciMemoization(num, memo) << std::endl; return 0; } ``` 在这个迭代版本中,我们利用一个`memo`数组来存储已经计算过的斐波那契数值,提高了效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值