剑指Offer 1. 斐波那契数列

问题描述

写一个函数,输入 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
	}
}
posted @ 2020-08-19 12:23  醉曦  阅读(180)  评论(0编辑  收藏  举报