编程之美2.9 斐波那契数列

斐波那契数列是我们在学习C语言的时候。在递归那一章的经典实例。当然,还会有汉诺塔的样例。

这个问题时这样定义的:

0 (x <= 0)

f(x)   =  1 (x == 1)

f(x - 1) + f(x - 2) (x > 1)

看到这个递推公式后。我们非常easy能够写出例如以下的代码:

函数声明:

typedef long long ll;
ll DutFibonacci_1(int);

函数定义:

/*经典的斐波那契数列的递归解法,并且每一个人都知道这样的方法效率非常低*/
ll DutFibonacci_1(int n)
{
	if (n <= 0)
		return 0;
	else if (n == 1)
		return 1;
	else
		return DutFibonacci_1(n - 1) + DutFibonacci_1(n - 2);
}

只是,当你输入一个比較大的 x 值后,你会发现,你等了非常久,还是没有不论什么输出,这就是递归效率低的问题。递归是利用栈的思想,一次次的入栈算它的前一个值,然后在一次次的出栈算它的后一个值,最后,得到终于的值(最后一个值)。

那么,我们能够知道,事实上这里须要保存函数的地址。各个參数的值等等一系列的操作,肯定是浪费了大量的时间和资源,所以。我们须要寻求第二种方法解决问题。

大多数递归的问题都是能够利用循环去解决的,所以,我们能够尝试的写出例如以下的循环求解代码:

函数声明:

ll DutFibonacci_2(int);

函数定义:

ll DutFibonacci_2(int n)
{
	if (n <= 0)
		return 0;
	else if (n == 1)
		return 1;

	ll one = 1;
	ll two = 0;
	ll result = 0;

	/*非递归解法也非常简单。利用两个中间数,计算“以前”出现的值就能够了*/
	for (int i = 2; i <= n; ++i)
	{
		result = one + two;

		two = one;
		one = result;
	}

	return result;
}
时间: 2024-08-16 00:34:09

编程之美2.9 斐波那契数列的相关文章

编程之美 2.9 斐波那契(Fibonacci)数列

编程之美 2.9 斐波那契(Fibonacci)数列 斐波那契的递归表达式如下 F(n)=F(n-1)+F(n-2) n>=2 F(1)=1 F(0)=0 书中提到了三中解决方法 第一种:直接运用递归的方法来进行求解 package org.wrh.programbeautiful; import java.util.Scanner; public class Topic2_9 { public static void main(String[] args) { Topic2_9 t=new T

C语言算法:完善当年自编的k阶斐波那契数列

以下为大二时候的日志回放:" 题目扩展到K阶, k阶斐波那契数列, 1阶(即k=1):1.1.1.1.1.1.1.-- a0=a[1-1]=1,a1=1,a2=1,a3=1,a4=1,a5=1,a6=1-- 3阶(k=3):0.0.1.1.2.4.7..... a0=0,a1=0,a2=a[3-1]=1,a3=0+0+1=1,a4=0+1+1=2,a5=1+2+4=7 4阶:0.0.0.1.1.2.4.8.15.27-- a0=0,a1=0,a2=0,a3=a[4-1]=1,a4=1,a5=2,

斐波拉契数列的计算方法

面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long Fib(unsigned int n) { if(n<=0) return 0; if(n==1) return 1; return Fib(n-1) + Fib(n-2); } 缺陷: 当n比较大时递归非常慢,因为递归过程中存在很多重复计算. 二.改进思路: 应该采用非递归算法,保存之前的计算结

vijos - P1543极值问题(斐波那契数列 + 公式推导 + python)

P1543极值问题 Accepted 标签:[显示标签] 背景 小铭的数学之旅2. 描述 已知m.n为整数,且满足下列两个条件: ① m.n∈1,2,-,K ② (n^ 2-mn-m^2)^2=1 编一程序,对给定K,求一组满足上述两个条件的m.n,并且使m^2+n^2的值最大.例如,若K=1995,则m=987,n=1597,则m.n满足条件,且可使m^2+n^2的值最大. 格式 输入格式 输入仅一行,K的值. 输出格式 输出仅一行,m^2+n^2的值. 样例1 样例输入1[复制] 1995

leetcode笔记:Climbing Stairs(斐波那契数列问题)

一.题目描述 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 题目的大意是,已知有n阶楼梯,每次只能爬1阶或2阶楼梯,问爬到第n阶楼梯共有几种爬法-_-||.题目可以看成是,设f(n)表示爬到第n 阶楼梯的方法数,为

关于“斐波那契数列”的编程

关于"斐波那契数列"的编程 今天上网看到一个有关"斐波那契数列"的数学概念.自己学习编程时间也不短了,就借这个东东练习一下. 斐波那契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)(来自百度) 一开始,我编程的代码如下: function fbnq($num) { if ($num == 0) { re

斐波那契数列实例讲解以及C++实现

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以<斐波纳契数列季刊>为名的一份数学杂志,用于专门刊载这方面的研究成果. 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34,

249 递归:概念,利用递归求1~n的阶乘,利用递归求斐波那契数列,利用递归遍历数据

6.1什么是递归 递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数. 简单理解: 函数内部自己调用自己, 这个函数就是递归函数 注意:递归函数的作用和循环效果一样,由于递归很容易发生"栈溢出"错误(stack overflow),所以必须要加退出条件return. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g

用递归和非递归的方法输出斐波那契数列的第n个元素(C语言实现)

费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数.斐波那契数列.费氏数列.黄金分割数列. 在数学上,费波那契数列是以递归的方法来定义: {\displaystyle F_{0}=0} {\displaystyle F_{1}=1} {\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出.首几个费波那契系数是: 0, 1, 1, 2, 3