17. 计算斐波那契数(非递归方法)

题目:

编写非递归函数计算斐波那契数 Fn 。对于每一个斐波那契数,你的代码应该只计算一次。测试你的代码。

思路:

非递归算法,要从正向进行迭代计算。我们统一一下定义:数列从 1 开始,即F(1) = 1, F(2) = 1。

利用三个变量:fib_front,fib_behind, fib。顾名思义,fib_front代表靠前的一个数,fib_behind代表靠后的一个数, fib代表当前的数。每次循环,将靠后的数值给靠前的那个,再将当前数的值给靠后的那个,这样就完成了一次迭代。

代码:

 1 #include <iostream>
 2 using namespace std;
 3
 4 long long fib_recursion (int n) {
 5     if (1 == n || 2 == n) {
 6         return 1;
 7     } else {
 8         return fib_recursion( n - 1 ) + fib_recursion( n - 2 );
 9     }
10 }
11
12 long long fib_non_recursion(int n) {
13     long long fib_front = 1, fib_behind = 1;
14     long long fib = 0;
15     if (1 == n || 2 == n) {
16         return 1;
17     }
18
19     for (int i = 3; i <= n; ++i) {
20         fib = fib_front + fib_behind;
21         fib_front = fib_behind;
22         fib_behind = fib;
23     }
24
25     return fib;
26 }
27
28 int main() {
29     cout << "Enter n : ";
30     int n;
31     cin >> n;
32     long long result = fib_recursion(n);
33     cout << "result(recursion) : " << result << endl;
34
35     result = fib_non_recursion(n);
36     cout << "result(non-recursion) : " << result << endl;
37
38     return 0;
39 }

代码中有几处需要说明:

第一,上面是递归算法,下面是非递归算法,放在一起方便对比。

第二,关于斐波那契数列,我们采用从 1 开始的定义方法。

原文地址:https://www.cnblogs.com/Hello-Nolan/p/12327535.html

时间: 2024-10-04 07:40:44

17. 计算斐波那契数(非递归方法)的相关文章

问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)

题目描述 这是一个斐波那契数列: f1 = 1 f2 = 2 fn = fn-1 + fn-2    (n>=3) 蔡老板想知道,给你两个数 a.b,你能否求出在区间[a,b]里有多少个斐波那契数. 输入 多组数据输入.一行为一组输入数据,包括两个非负整数 a.b(a <= b <= 10^100),当a=b=0 时输入终止. 输出 对每组输入,输出单独一行,包含一个整数表示区间[a,b]里的斐波那契数个数. 样例输入 10 100 1234567890 9876543210 0 0 样

算法笔记_001:斐波那契数的多种解法

本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第几个斐波那契数.(Java: 231-1 for int, 263-1 for long) 解决方案:针对问题1,此处要使用迭代法来解决,具体实现代码如下: //用迭代法寻找编程环境支持的最大整数(int型)的斐波那契数是第几个斐波那契数 public static int max_int_iter

以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划主要用于解决包含重叠子问题的最优化问题,其基本策略是将原问题分解为相似的子问题,通过求解并保存重复子问题的解,然后逐步合并成为原问题的解.动态规划的关键是用记忆法储存重复问题的答案,避免重复求解,以空间换取时间. 用动态规划解决的经典问题有:最短路径(shortest path),0-1背包问题(K

斐波那契数与二分法的递归与非递归算法及其复杂度分析

1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加.特别指出:0不是第一

分治法--二分查找、乘方、斐波那契数

1.二分查找 常见错误: 死循环:循环体外的初始化条件,与循环体内的迭代步骤, 都必须遵守一致的区间规则,也就是说,如果循环体初始化时,是以左闭右开区间为边界的,那么循环体内部的迭代也应该如此.如果两者不一致,会造成程序的错误. 溢出:middle = left + (right - left) / 2 终止条件:一般来说,如果左闭右闭,则left<=right: 如果一开一闭,则left<right: 关键看left能不能等于right,而且要考虑实际情况,有时不能这样简单终结,会出现死循环

用安卓实现斐波那契数和最近点对问题

目录 1 运行效果展示 2 具体编码 2.1 斐波那契数问题 2.2 最近点对问题 1 运行效果展示 2 具体编码 2.1 斐波那契数问题 具体问题即解决方案请参考本人另一篇博客:算法笔记_001:斐波那契数的多种解法 功能界面布局main_one.xml文件对应界面图: 其源码: <?xml version="1.0" encoding="utf-8" ?> <GridLayout xmlns:android="http://schem

HDU 5914 Triangle(打表——斐波那契数的应用)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whose lengths are 1,2, 3?n respectively. Wallice is a bad man, so he does not want Mr. Frog to form a triangle with three of the sticks here. He decides t

递归求斐波那契数

斐波那契数列主要思想是利用前两个数求和算出下一个数,利用函数的递归思想,F(n)=F(n-1)+F(n-2),F(n)先搁置,计算F(n-1),要计算F(n-1)就要先计算F(n-2)和F(n-3),依次递归下去,直到第一第二位数,这两个数是已知的,这样就可以回去一层一层的算出F(3).F(4).F(5)....F(n-2).F(n-1),最后得到F(n)的值. 1 using System; 2 using System.Collections.Generic; 3 using System.

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

递归是一种强有力的技巧,但和其他技巧一样,它也可能被误用. 一般需要递归解决的问题有两个特点: 存在限制条件,当符合这个条件时递归便不再继续: 每次递归调用之后越来越接近这个限制条件. 递归使用最常见的一个例子就是求阶乘,具体描述和代码请看这里:C语言递归和迭代法求阶乘 但是,递归函数调用将涉及一些运行时开销--参数必须压到堆栈中,为局部变量分配内存空间(所有递归均如此,并非特指求阶乘这个例子),寄存器的值必须保存等.当递归函数的每次调用返回时,上述这些操作必须还原,恢复成原来的样子.所以, 基