首页 > 其他 > 详细

剑指Offer 1. 斐波那契数列

时间:2020-08-19 13:11:44      阅读:112      评论:0      收藏:0      [点我收藏+]

问题描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下

F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回1

解决方案

暴力递归,这样会超时

// 递归解法,但是求解速度慢,效率高,可以使用剪枝法优化
// 在实际提交代码时,这种解法会超时
func RecurbFib(n int) int {
	if n == 0 {
		return 0
	}
	if n == 1 {
		return 1
	}

	return RecurbFib(n - 1) + RecurbFib(n - 2)
}

动态规划

// 动态规划题解
func DynamicFib(n int) int {
	if n == 0 || n == 1 {
		return n
	}

	dp := make([]int, n + 1)
	dp[0] = 0
	dp[1] = 1

	for i := 2; i <= n; i++ {
		dp[i] = (dp[i - 1] + dp[i - 2]) % (1e9 + 7)
	}

	return dp[n]
}

使用循环

func Fib(n int) int {
    var f0 = 0
    var f1 = 1
	var i = 2
	
    for {
        if i > n {
            break
        }

        f1 = f0 + f1
        f0 = f1 - f0
        // 这里需要注意题意,超过某个数的时候需要重新取余
        if f1 > (1e9 + 7) {
            f1 = f1 % (1e9 + 7)
        }
        
        if f0 > (1e9 + 7) {
            f0 = f0 % (1e9 + 7)
        }
        i++
    }

    if n == 0 {
		return f0
	} else {
		return f1
	}
}

剑指Offer 1. 斐波那契数列

原文:https://www.cnblogs.com/zuixime0515/p/13528609.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!