首页 > 其他分享 >在C语言中用函数求fibonacci(斐波那契)数列前n项的和

在C语言中用函数求fibonacci(斐波那契)数列前n项的和

时间:2024-11-11 20:14:58浏览次数:3  
标签:函数 sum C语言 斐波 fibonacci 计算 那契 数列

1.功能

用函数求fibonacci数列前n项的和。

2.说明

fibonacci数列为数列的第一项值为1,第二项值也为1,从第三项开始,每一项均为其前面相邻两项的和。

3.题目

例如:当n = 28时,运行结果:832039。请编写sum函数。

#include <stdio.h>

// 函数sum用于计算斐波那契数列前n项的和
long sum(int n )
{
    
                   // 初始化斐波那契数列的前两项为1
    int fib1 = 1, fib2 = 1;
                   // fibNext用于存储下一个斐波那契数,sum初始化为2(前两项的和)
    int fibNext, sum = 2;
                   // 从第三项开始计算斐波那契数列,并累加到sum中
    for(int i = 3; i <= n; i++)
    {
                   // 计算下一个斐波那契数
        fibNext = fib1 + fib2;
                   // 更新fib1和fib2,为下一次计算做准备
        fib1 = fib2;
        fib2 = fibNext;
                   // 将新生成的斐波那契数累加到总和sum中
        sum += fibNext;
    }
                   // 返回斐波那契数列前n项的和
    return sum;
   
}

int main()
{
                   // 定义变量n用于存储用户输入的项数
    long int n;
                   // 从用户输入获取项数n
    scanf("%ld", &n);
                   // 调用sum函数计算并输出斐波那契数列前n项的和
    printf("sum=%ld\n", sum(n));
    return 0;
}

 运行结果:

 

扩展: 

4.求斐波那契的核心

1. 递归关系

 

2.迭代实

 

3.矩阵乘法(高级优化方法)

 

5.补充

在使用函数求解斐波那契数列时,有以下几个需要注意的地方:

一、算法实现方面

1. **递归深度** - 如果使用递归方法来计算斐波那契数列

例如经典的F(n) = F(n - 1)+F(n - 2),F(0)=0,F(1)=1),要注意递归深度的问题。斐波那契数列的递归实现会导致大量的重复计算,时间复杂度呈指数级增长(大约为O(2^n))。

例如,计算F(5)时,F(3)会被重复计算两次,F(2)会被重复计算三次等。对于较大的n,这种方法会非常慢,甚至可能导致栈溢出。 - 为了避免这个问题,可以考虑使用迭代的方法来计算斐波那契数列,如你提供的代码中的循环方式。迭代方法的时间复杂度为O(n),效率更高。

2. **整数溢出** - 斐波那契数列增长非常快。

例如,第47项就已经超过了32位有符号整数的最大值(2147483647),第93项超过了64位有符号整数的最大值(9223372036854775807)。如果使用的整数类型范围有限,在计算较大项数的斐波那契数列时,会发生整数溢出。 - 解决方法可以是使用高精度整数库(例如在C++ 中可以使用boost::multiprecision库),或者根据具体需求选择合适的数据类型(如unsigned long long可以处理较大的整数,但也有其上限)。

二、函数设计方面

1. **参数合法性检查** - 在函数入口处,应该对输入的参数进行合法性检查。

例如,确保输入的项数n是非负整数。如果n为负数,函数的行为是未定义的,可能会导致错误结果或者程序崩溃。

2. **函数接口设计** - 函数的接口应该清晰明了。

例如,函数的参数类型和返回值类型要符合实际需求。如果函数需要在不同的程序中复用,应该考虑函数的通用性和可扩展性。 - 对于计算斐波那契数列的函数,可以考虑添加额外的功能,如计算到第`n`项的斐波那契数列的所有值(而不仅仅是第n项的值),或者返回一个包含斐波那契数列值的数组等。

 三、性能优化方面

1. **矩阵快速幂优化(对于大规模计算)**

- 对于非常大的n(例如n在几千甚至更大的数量级),可以使用矩阵快速幂算法来计算斐波那契数列。斐波那契数列可以通过矩阵乘法来表示递推关系,通过矩阵快速幂算法可以将时间复杂度降低到O(log n)。

2. **缓存中间结果(记忆化)**

- 如果出于某些原因必须使用递归方法,可以使用记忆化技术。通过创建一个数组来存储已经计算过的斐波那契数,每次计算前先检查数组中是否已经存在结果,如果存在则直接返回,避免重复计算。

总之,在实现斐波那契数列的计算函数时,要综合考虑算法效率、数据类型范围、函数接口设计和性能优化等多个方面。

标签:函数,sum,C语言,斐波,fibonacci,计算,那契,数列
From: https://blog.csdn.net/2402_88478893/article/details/143694098

相关文章

  • 重温c语言之,7天开整,就是随便的写写,第十天
    一:操作符&:按位与----2进制|:按位或----2进制^:按位异或----2进制~:按位取反---2进制&:先上代码,然后解释1#define_CRT_SECURE_NO_WARNINGS23#include<stdio.h>4intmain()5{6inta=3;7intb=-5;8intc=a&......
  • C语言中的数组
    数组在C语言中的应用场景非常非常多,例如:(作者用C语言写过一个三字棋小游戏详情可见链接)https://blog.csdn.net/2401_87984738/article/details/143487668?sharetype=blog&shareId=143487668&sharerefer=APP&sharesource=2401_87984738&sharefrom=link相信你们在学完今天这节数......
  • 2024年全国高校计算机能力挑战赛C语言计算机能力挑战赛赛前模拟
    2024年全国高校计算机能力挑战赛C语言计算机能力挑战赛赛前模拟18拉手游戏某个班级共n(2<n<100)人玩报数游戏,同学们最初手拉手围成一圈。小明最开始站在第m(0<m<n)个位置,现在从圈内第一个位置开始报数,但凡报到3就退出圈子,问小明是第几个退出圈子的人?输入格式:一行输入两个......
  • C语言网题目 1004: [递归]母牛的故事
    题目描述有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?输入格式输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做......
  • ag——ack 的升级版,C语言编写,更快更人性化
    转自于:https://github.com/jaywcjlove/linux-command,后不赘述agack的升级版,C语言编写,更快更人性化补充说明摘自https://github.com/ggreer/the_silver_searcher项目的Readme.md它比ack快一个数量级。它忽略了你的.gitignore和.hgignore中的文件模式。如果你的......
  • C语言核心知识(下)
     一、变量1、变量定义2、变量的定义格式3、变量的使用  4、应用5、总结A、变量如何定义?    数据类型变量名;  eg:inta; B、变量如何使用?   @·1、赋值/修改值       a=21;   @·2、获取值        ......
  • C语言的概述及开发工具
    目录一、C语言的概述二、C语言的开发工具总结一、C语言的概述C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972年,DennisRitchie设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。尽管C语言是与UNIX操作系统一起被开发出来的,但......
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.17——字符函数&&字符串函数
    文章目录1.字符函数1.1字符分类函数1.1.1islower1.2字符转换函数1.2.1tolower2.字符串函数2.1strlen2.2strcpy和strncpy2.3strcat和strncat2.4strcmp和strncmp2.5strstr2.6strtok2.7strerror希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的......
  • 2个月搞定计算机二级C语言——真题(11)解析
    1.前言今天双11,正好轮到讲第11篇,直接来个三11。那么本篇我们讲解2个月搞定计算机二级C语言——真题112.程序填空题2.1题目要求2.2提供的代码#include<stdio.h>#include<ctype.h>#pragmawarning(disable:4996)voidfun(int*cd,int*cu,int*cs){......
  • 斐波那契数
    题目斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给定n,请计算F(n)。分析初始状态f(0)=0;f(1)=1;转移F(n)=F(n-......