编程题目: 斐波那契以及台阶问题

       0         n = 1

f(n)  =     1          n = 1

       f(n-1) + f(n-2)  n >=2

一.斐波那契

1.递归实现

递归实现的代码一目了然,简单易懂.但重复计算了元素,所以效率比较低下。

 1 #!/usr/bin/env python3
 2
 3 def fibs(n):
 4         if n < 0:
 5                 raise ValueError("n must >= 0")
 6         if n == 0 or n == 1:    return 1
 7         else:
 8                 return fibs(n-2) + fibs(n-1)
 9
10 if __name__ == "__main__":
11         print(fibs(10))

2.迭代实现

迭代的时间效率为 0(n),空间效率为0(1)

 1 #!/usr/bin/env python3
 2
 3 def fibs(n):
 4         if n < 0:
 5                 raise ValueError("n must >= 0")
 6         a = [1,1]
 7         if n == 0 or n == 1:    return 1
 8         for i in range(2,n+1):
 9                 a[0],a[1] = a[1],a[0]+a[1]
10         return a[1]
11
12 if __name__ == "__main__":
13         print(fibs(10))

二.台阶问题

一只青蛙可以一次跳1阶台阶,也可以一次跳2次台阶。请问当这只青蛙跳了n阶的时候,请问有多少种跳法?

求f(n),当青蛙跳了1阶台阶的时候,这个问题就变成了f(n-1);

当青蛙跳了2阶台阶的时候,这个问题就变成了f(n-2)。

所以 f(n) = f(n-2) + f(n-1)

当只有1阶时,有1种跳法;当位2阶时,有2种跳法。

所以

       1         n = 1

f(n)  =     2          n = 2

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

 1 #!/usr/bin/env python3
 2
 3 def taijie(n):
 4         if n <= 0:
 5                 raise ValueError("n must >0")
 6         a = [1,2]
 7         if n == 1:      return 1
 8         if n == 2:      return 2
 9         for i in range(3,n+1):
10                 a[0],a[1] = a[1],a[0]+a[1]
11         return a[1]
12
13 if __name__ == "__main__":
14         print(taijie(5))
时间: 2024-10-25 14:36:40

编程题目: 斐波那契以及台阶问题的相关文章

《剑指Offer》题目——斐波拉契数列

题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.(n<=39) 题目分析:如果使用简单的递归,很容易造成栈溢出.采用递推的方式即可. 代码: public class Fibonacci { public static int fibonacci(int n){ int res[] = new int[2]; res[0]=1; res[1]=1; int temp = 0; if(n==0) return 0; if(n<=2) return res[

LintCode Python 入门级题目 斐波纳契数列

原题描述: 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ... 题目分析: 开始的想法,通过递归实现输出fib(n-1)+fib(n-2)的值计算,原理正确,算法复杂度高,导致运行时间超过lintcode限制: class Solution: # @param n: an integer # @retur

C语言编程实现斐波那契数列(递归与非递归)

一.非递归 <1>数组 #include<stdio.h> #include<stdlib.h> int main() { int a[10000] = { 0 };//利用数组求不了较大位置的斐波那契数 int i,m; a[0] = 1; a[1] = 1; printf("请输入要求第几个斐波那契数(大于等于2)\n"); scanf("%d", &m); for (i = 2; i <=m; i++) { a

[发布] 矩阵乘法及其对于编程求斐波那契数列的某一项的应用

需要PDF的读者可以向我索要. 如果发现有翻印与用于商业用途,将予追究. ======================================= 编者注:本文中如果没有特殊说明,除法均只取整数部分,忽略小数部分. 感谢大家对我的支持!同时感谢ysy大聚聚.

【算法】还在用递归实现斐波那契数组,面试官一定会鄙视你到死

我记得在初学C语言的时候,大学老师经常会讲一些常见的数学问题及递归的使用,其中斐波那契数组的实现就是一定会被拿出来举例的.在后来工作中,面试做面试题的时候,也很大概率会出现编程实现斐波那契额数组算法.可以说,在我们编程道路上,编写程序实现斐波那契数组算法是每个程序员必定会做的一件事. 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,

【编程小题目1】求解斐波拉契数列问题

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 斐波那契数列又因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”.Fibonacci 数列定义:n = 1,2 时,fib(n) = 1n > 2 时,fib(n) = fib(n-2) + fib(n-1) // 递归算法求解Fibonacci 数列 #i

青蛙跳台阶问题-斐波拉契数列

题目1:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级.求总共有多少种跳法 首先我们考虑最简单的情况,加入只有1级台阶,那显然只有一种跳法,如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级:另外一种就是一次跳2级 现在我们来讨论一般情况.我们把n级台阶时的跳法看成是n的函数,记为f(n).当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1):另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的

斐波那契(递归思想)跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以 F(n) = F(n-1) + F(n-2) 斐波拉契数序列,初始条件 n=1:只能一种方法 n=2:两种 递归一下就好了 public class Solution {    public int JumpFloor(int target) {        if(target <= 0)            return 0; 

斐波那契序列与跳台阶

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25337983 剑指offer上的第就题,简单题,在九度OJ上测试通过. 主要注意以下几点: 1.用非递归实现,递归会超时 2.结果要用long long保存,不然会发生结果的溢出,从而得到负值 3.如果是在VC++6.0下编译的,long long是illegal的,要用_int64代替,同时输出的转化以字符也要用%64d代替%lld 时间限制:1 秒 内存限制:32 兆 题目描述: 大