首页 > 解决方案 > Go中使用递归和并发的第N个斐波那契数

问题描述

我试图翻译的 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")
    }

}

标签: gorecursionconcurrencyfibonaccigoroutine

解决方案


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

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

和


推荐阅读