动态规划DP在计算斐波那契数列时的应用

举报
码乐 发表于 2024/09/24 15:32:42 2024/09/24
【摘要】 1 简介在Go中实现一个递归的斐波那契数列生成器并使用缓存技术来减少计算次数,我们可以使用一个带有缓存(memoization)的递归函数。缓存技术可以通过一个映射(map)来实现,记录每个计算过的斐波那契数。 2 实现示例下面是一个示例代码,展示了如何实现这一点:package mainimport ( "fmt")// FibonacciGenerator 是一个结构体,包含一个缓存m...

1 简介

在Go中实现一个递归的斐波那契数列生成器并使用缓存技术来减少计算次数,我们可以使用一个带有缓存(memoization)的递归函数。缓存技术可以通过一个映射(map)来实现,记录每个计算过的斐波那契数。

2 实现示例

下面是一个示例代码,展示了如何实现这一点:

package main

import (
	"fmt"
)

// FibonacciGenerator 是一个结构体,包含一个缓存map
type FibonacciGenerator struct {
	cache map[int]int
}

// NewFibonacciGenerator 初始化一个新的FibonacciGenerator
func NewFibonacciGenerator() *FibonacciGenerator {
	return &FibonacciGenerator{
		cache: make(map[int]int),
	}
}

// Fibonacci 递归计算斐波那契数列,并使用缓存技术
func (fg *FibonacciGenerator) Fibonacci(n int) int {
	if n <= 1 {
		return n
	}
	if val, ok := fg.cache[n]; ok {
		return val
	}
	fg.cache[n] = fg.Fibonacci(n-1) + fg.Fibonacci(n-2)
	return fg.cache[n]
}

func main() {
	fg := NewFibonacciGenerator()
	
	// 测试输出前20个斐波那契数列
	for i := 0; i < 20; i++ {
		fmt.Printf("Fibonacci(%d) = %d\n", i, fg.Fibonacci(i))
	}
}

3 解析

  • 代码解析

FibonacciGenerator结构体:
包含一个缓存cache,用于存储已经计算过的斐波那契数。

NewFibonacciGenerator函数:
初始化一个新的FibonacciGenerator实例,并创建一个空的缓存map。

Fibonacci方法:
递归计算斐波那契数。当计算某个数时,首先检查缓存中是否已经存在。如果存在则直接返回,否则进行递归计算,并将结果存入缓存。

main函数:
创建一个FibonacciGenerator实例,并测试输出前20个斐波那契数。

通过这种方式,可以有效减少重复计算,提高程序的执行效率。

每个斐波那契数只会被计算一次,然后存储在缓存中,后续的查询将直接从缓存中读取。

实现next函数 计算下一个斐波那契数列

package main

import (
	"fmt"
)

// FibonacciGenerator 是一个结构体,包含一个缓存map和当前的状态
type FibonacciGenerator struct {
	cache map[int]int
	index int
}

// NewFibonacciGenerator 初始化一个新的FibonacciGenerator
func NewFibonacciGenerator() *FibonacciGenerator {
	return &FibonacciGenerator{
		cache: make(map[int]int),
		index: 0,
	}
}

// Fibonacci 递归计算斐波那契数列,并使用缓存技术
func (fg *FibonacciGenerator) Fibonacci(n int) int {
	if n <= 1 {
		return n
	}
	if val, ok := fg.cache[n]; ok {
		return val
	}
	fg.cache[n] = fg.Fibonacci(n-1) + fg.Fibonacci(n-2)
	return fg.cache[n]
}

// Next 返回下一个斐波那契数
func (fg *FibonacciGenerator) Next() int {
	val := fg.Fibonacci(fg.index)
	fg.index++
	return val
}

func main() {
	fg := NewFibonacciGenerator()

	// 测试输出前20个斐波那契数列
	for i := 0; i < 20; i++ {
		fmt.Printf("Fibonacci(%d) = %d\n", i, fg.Next())
	}
}

4 小结

动态规划思想一个最重要的特征就是分析问题,如果一个问题可以通过分解的方式以子问题的方式解决,并在最后得出最终问题的答案,那么通常就适合使用动态规划方法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。