递归和循环:斐波那契数列
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39
解题思路
递推公式f(n)=f(n)=
当n=0=0,当n=0 当
n=1=1,当n=1
其他=f(n−1)+f(n−2)看到这大家很容易想起递归,课堂上老师讲递归的时候的经典例子。但是当n很大的时候,就会出现堆栈溢出。堆栈溢出的主要原因是,递归重复的计算太多,很多计算是可以避免的,用循环计算结果,显根据前两项算出第三项,以后每次都是这样计算。
代码实现
递归实现
public static int Fibonacci(int n) {if (n <= 1) return n;return Fibonacci(n - 1) + Fibonacci(n - 2);}
循环实现
public static int Fibonacci2(int n){if (n <= 1) return n;int first = 0;int second = 1;int result = 0;for (int i = 2; i <= n; i++){result = first + second;first = second;second = result;}return result;}
斐波那契数列求和
public static int FibonacciSum(int n) {if (n <= 1) return n;int first = 0;int second = 1;int temp = 0;int result = first + second;for (int i = 2; i <= n; i++) {temp = first + second;first = second;second = temp;result = result + temp;}return result;}
斐波那契数列求和,利用公式计算
public static int FibonacciSum2(int n){if (n <= 1) return n;int first = 0;int second = 1;int temp = 0;for (int i = 2; i <= n; i++){temp = first + second;first = second;second = temp;}int result = 2 * second + first - 1; //Sn = 2an + an - 1 - 1return result;}
测试
[Fact]public void Test0(){Assert.Equal(0, Coding007.Fibonacci(0));Assert.Equal(0, Coding007.Fibonacci2(0));Assert.Equal(0, Coding007.FibonacciSum(0));Assert.Equal(0, Coding007.FibonacciSum2(0));}[Fact]public void Test1(){Assert.Equal(1, Coding007.Fibonacci(1));Assert.Equal(1, Coding007.Fibonacci2(1));Assert.Equal(1, Coding007.FibonacciSum(1));Assert.Equal(1, Coding007.FibonacciSum2(1));}[Fact]public void Test2(){Assert.Equal(1, Coding007.Fibonacci(2));Assert.Equal(1, Coding007.Fibonacci2(2));Assert.Equal(2, Coding007.FibonacciSum(2));Assert.Equal(2, Coding007.FibonacciSum2(2));}[Fact]public void Test3(){Assert.Equal(2, Coding007.Fibonacci(3));Assert.Equal(2, Coding007.Fibonacci2(3));Assert.Equal(4, Coding007.FibonacciSum(3));Assert.Equal(4, Coding007.FibonacciSum2(3));}[Fact]public void Test4(){Assert.Equal(3, Coding007.Fibonacci(4));Assert.Equal(3, Coding007.Fibonacci2(4));Assert.Equal(7, Coding007.FibonacciSum(4));Assert.Equal(7, Coding007.FibonacciSum2(4));}[Fact]public void Test5(){Assert.Equal(5, Coding007.Fibonacci(5));Assert.Equal(5, Coding007.Fibonacci2(5));Assert.Equal(12, Coding007.FibonacciSum(5));Assert.Equal(12, Coding007.FibonacciSum2(5));}[Fact]public void Test6(){Assert.Equal(8, Coding007.Fibonacci(6));Assert.Equal(8, Coding007.Fibonacci2(6));Assert.Equal(20, Coding007.FibonacciSum(6));Assert.Equal(20, Coding007.FibonacciSum2(6));}
View Code
想入非非:扩展思维,发挥想象
1. 熟悉递归
2. 熟悉斐波那契数列
3. 斐波那契数列求和
4. 知道有公式的就用公式,不要自己去循环就算,就像1+2+3+......,用高斯定理直接算结果,不要再循环了
转载于:https://www.cnblogs.com/zhao123/p/11158187.html
递归和循环:斐波那契数列相关推荐
- 用递归法计算斐波那契数列的第n项
斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...
- python 递归方式实现斐波那契数列
python 递归方式实现斐波那契数列 import time t1=time.time() def factorial(n):if n==1 or n==2:return 1else:return ...
- python装饰器模式带参数_Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)...
Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...
- C语言递归算法求斐波那契,递归法求斐波那契数列(C语言版)
斐波那契数列: 又称黄金分割数列,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 在数学上,斐波纳契数列以如下被以递归的方法定义 ...
- 循环斐波那契数列_剑指offer #10 斐波那契数列
(递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...
- 循环斐波那契数列_每日一课 | 斐波那契数列的第n个项
Python程序借助两种方法来计算斐波那契数列的第n个项 (有许多方法可以计算第n个项). 描述: 第一种方法:动态编程 在这种方法中,我们计算出斐波那契数列直到n的所有项,如果我们需要计算小于n的任 ...
- 递归与分治——斐波那契数列非递归,递归,与优化后的递归算法
斐波那契数列: 1.1.2.3.5.8.13.21.-- 简单说,就是前两项的和是第三项的值. 1.求第N个斐波那契数的值(非递归) //斐波那契数列 int fun(int n) {int a = ...
- 递归 和 迭代 斐波那契数列
#include "stdio.h"int Fbi(int i) /* 斐波那契的递归函数 */ { if( i < 2 ) return i == 0 ? 0 : 1; r ...
- 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)
话不多说,先上源码: 阶乘: #include<iostream> #include<bits/stdc++.h> using namespace std;int JieChe ...
最新文章
- 软件测试人员必备Linux命令(初、中、高级)
- 目标跟踪算法五:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
- 从今天开始,学习Webpack,减少对脚手架的依赖(下)
- 慕课网初识python_初识Python笔记
- git的一些常用命令讲解和开发规范总结
- sigmastarSSD201/SSD202 github上开源了!
- ESD二极管 DW12P4N3-S 电压12V 封装DFN2020-3L
- 前端学习(1385):多人管理项目5抽离
- matlab与maple互联,Matlab,Maple和Mathematica三款主流科学计算软件的互操作
- ABAP操作Excel(转)
- 2012年8月20日 我单身了!
- 密码分析学中常见的攻击模式
- js 设置焦点 判断控件是否获得焦点 判断哪个控件获得焦点
- 蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)
- 怎么看自己电脑MySQL版本_如何查看自己电脑sqlserver数据库版本
- 【JS教程】移动端 Touch(触摸)事件
- 数字孪生数字汽车风洞技术研究案例
- kmeans以及kmeans++聚类生成anchors
- Python爱因斯坦阶梯问题
- onMeasure(int widthMeasureSpec, int heightMeasureSpec)