登录
首页 >  Golang >  Go问答

Go 中使用递归和并发的第 N 个斐波那契数

来源:stackoverflow

时间:2024-03-16 17:09:21 277浏览 收藏

**摘要** 斐波那契数列是一种由相邻两项之和构成的数列,通常用于测试算法效率。本文介绍了一种使用递归和并发编程的算法,用于计算斐波那契数列中的第 N 个数。该算法利用 Go 语言的 goroutine 机制,将计算任务分解为多个并行执行的子任务,从而提高效率。本文还分析了该算法的时间复杂度,并提供了示例代码和性能测试结果,以展示其在处理大型 Fibonacci 数值时的优越性。

问题内容

我正在尝试翻译的 java 代码。我一直在尝试实现这个在go中获取第n个斐波那契数的java方法,但我似乎无法让我的代码在崩溃之前超过斐波那契数35。此方法应该效率非常低,但并没有低到无法完成的程度。

package main

import (
    "fmt"
    "time"
)

type Fibonacci struct {
    num    float64
    answer float64
}

func newFibonacci(n float64) *Fibonacci {

    f := new(Fibonacci)
    f.num = n
    c1 := make(chan float64)
    c2 := make(chan float64)

    if f.num <= 1 {
        f.answer = n
    } else {
        go func() {
            fib1 := newFibonacci(n - 1)
            c2 <- fib1.answer
        }()
        go func() {
            fib2 := newFibonacci(n - 2)
            c1 <- fib2.answer   
        }()

        f.answer = <-c2 + <-c1
    }
    close(c1)
    close(c2)

    return f
}

func main() {

    numbers := []float64{30, 35, 36, 37, 38, 39, 40}
    for _, value := range numbers{
        start := time.Now()
        fmt.Println("getting the ", value, " fibonacci number")
        f := newFibonacci(value)
        fmt.Println(f.answer)
        end := time.Now()
        totalTime := end.Sub(start)
        fmt.Println("Fibonacci number: ", value, " took ", totalTime, "\n")
    }

}

解决方案


我建议你计算一下你实际启动了多少个 goroutine。

你的第一次调用会产生两个 goroutine。每一个都会产生两个另外的 goroutine。生成的 goroutine 总数将为 2^1 + 2^2 + 2^3 + ... + 2^n。虽然其中很多会在达到下面的数字之前退出,但它仍然是很多 goroutine。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>