基础-斐波那契数列 利用循环输出前40项 (初学者)

问题描述

斐波那契数列 利用循环输出前40项 (初学者)

我在查了资料之后找到以下解决方法:
#include
  int main()
  {
  long fib[41] = {0,1};
  int i;
  for (i=2;i<41;i++) fib[i] = fib[i-1]+fib[i-2];
  for (i=1;i<41;i++) printf("F%d==%dn",i,fib[i]);
  getch();
  return 0;
  }

有些看不懂,希望可以帮我详细分析一下运算过程,或者提供相关的知识点以供研究。
谢谢。

解决方案

首先你要知道斐波那契数列的规律也就是0、1、1、2、3、5、8、13、21、……,通过这个就可以知道从第三个元素开始,他的值等于前面两个元素的和,下面分析代码

long fib[41] = {0,1}; 定义了一个数组,设置了0 1 坐标元素的值为 0 1

for (i=2;i<41;i++) fib[i] = fib[i-1]+fib[i-2]; 这个循环是冲i等于2开始运算的,也就是数组的第三个元素,fib[i] = fib[i-1]+fib[i-2] 因为斐波那契数列的规律是从第三个元素开始等于前面两个相加,也就是fib[i-1],fib[i-2]这两个

for (i=1;i<41;i++) printf("F%d==%dn",i,fib[i]); 这里是打印,上面的代码可以看出,数组第一个和第二个元素没有参与运算,但long fib[41] = {0,1};这里已经声明了,所以第一个第二个元素固定为0、1,第三个开始就是前面两个相加。

不知道说的详细不详细,你明白不明白。

解决方案二:

这样实现的效率不高,计算40项表现不出来,如果计算400项的时候,那就会发现非常慢。
long main(int n){
if(n > 1){
long a = 0, b = 1;
do{
long temp = b;
b += a;
a = temp;
}while(--n > 1);
return b;
}
return n;
}
看是简单的“杯子倒水”、看是没有什么技术含量,但是他的效率绝对比迭代来得高。

解决方案三:

这个是迭代法,如果你想要深入探讨的话,可以去研究高效的矩阵乘法。

解决方案四:

long a = 0;
long b = 1;
int count = 40;
for (int i = 0; i < (count+1)/2; i++) {
b = a + b;
a = a + b;
}
这样效率更高些

时间: 2025-01-20 20:05:00

基础-斐波那契数列 利用循环输出前40项 (初学者)的相关文章

输出斐波那契数列的算法

斐波那契数列(Fibonacci polynomial),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.-- 要求编程输出这样的一组数,比如输出10个数的序列 /** * @param i 第n个数 * @param j 第n+1个数 * @param n 输出个数 */ public static void ff( int i,int j,int n){ int m=1; System.out.print(i+","); while(m++<n)

利用Redis缓存提高斐波拉契数列程序的性能例子

去某家公司面试,PHP岗位,先做笔试,再两轮面试,最后hr面,拿了offer.   笔试题都不难,做完随手拍了一张,然后回去把这道求斐波那契数列的题在电脑上运行了一遍,写的当然是对的,但是当你要求第N位,当N大于60的时候就会非常慢了,后来就想着用Redis缓存来优化性能,效果非常惊人!     我把题目改了一下,也是要用递归,但是是要列出从0到n的斐波那契数列,并且用Redis缓存.   思路很简单,每次取第n的值的时候判断Redis有没有,有就不用再去计算了,没有就计算一次存下来,大大减少计

斐波那契数列 优化矩阵求法实例_C 语言

在做编程题目的时候经常会遇到"斐波那契数列"相关的题目,尤其在做OJ中.下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级. 复制代码 代码如下: long long fac(int n){ if(n==1) return 1; else if(n==2)  return 2; else   return fac(n-1)+fac(n-2);} (二)循环 利用临时变量来保存中间的计算过程,加快运算. 复制代码 代码如下: long long fac(int

斐波那契数列 矩阵求法 优化

在做编程题目的时候经常会遇到"斐波那契数列"相关的题目,尤其在做OJ中.下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级. long long fac(int n) { if(n==1) return 1; else if(n==2) return 2; else return fac(n-1)+fac(n-2); } (二)循环 利用临时变量来保存中间的计算过程,加快运算. long long fac(int n) { long long a=1,b=2,

打印菱形以及斐波纳契数列的几种解法介绍

1.编写程序,打印*菱形推出第i行要打印的空白个数及*号个数,用for循环依次打印各行 复制代码 代码如下: #include<stdio.h> //总共要打印2*n-1行,逐行打印 void print1(int n) { int i,j; for(i=1;i<=n;i++){//打印1至n行 for(j=1;j<=n-i;j++)//打印n-i个空格 printf(" "); for(j=1;j<=2*i-1;j++)//打印2*i-1个*号 prin

斐波那契数列和反向计算问题

反向计算:编写一个函数将一个整型转换为二进制形式 反向计算问题,递归比循环更简单 分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是奇数,0本身是偶数.     十进制整数转换为二进制整数采用"除2取余,逆序排列"法. 具体做法是:用2整除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,

php处理斐波那契数列非递归方法_php技巧

我自己构思了下,实际上程序来解决这个事情,就是一个偏移量的问题.首先看数列::1.1.2.3.5.8.13.21.34数列的下一个数是前2个数字之和,以此类推. 程序处理的话,实际上就是一个FOR语句,传统FOR语句是for($i=1;$i;$count,$i++),这里的偏移量是$i=$i+1.如果处理这个数列的话,这个偏移量就不是1了,是前1个数字.那么当你for的时候,一个变量记录上一个数字,另外一个记录当前数字,偏移量为这上一个数字,然后在循环中重新赋值,将上一个数字记录成当然循环值,以

内存管理-根据题目,编这个程序怎么会联想到用斐波那契数列?

问题描述 根据题目,编这个程序怎么会联想到用斐波那契数列? 4.编写-个函数,它返回函数自身被调用的次数,并在一个循环中测试之. #include int Fibonacci(int n); int count; int main(void) { int n; printf("input the max term of Fibonacci:"); while( scanf("%d",&n) == 1 ) { count = 0; Fibonacci(n);

递归解决斐波那契数列

1.什么是递归? 递归:递归是方法定义调用方法本身的现象.递归举例如下: <span style="font-size:14px;">public class DiGuiDemo { //递归方法举例 public void show() { show(); } } </span> 2.递归的注意事项? (1)递归一定要有出口.否则就会死递归. 上面举例用的递归就是一个死递归,方法永远都在进行自身调用,最终一定会陷入内存崩溃.所以递归要定义出口,就是结束递归的条