其实最好的方法是使用动态规划。。。
代码实现(使用goroutine和全局互斥锁)
package main
import (
"fmt"
"sync"
"time"
)
// 全局变量myMap
var (
myMap = make(map[int]int, 20)
lock sync.Mutex
)
func caltulateFactorial(n int){
res := 1
for i:=1;i<=n;i++{
res *= i
}
// 加锁
lock.Lock()
// 将res放入myMap中
myMap[n] = res
// 解锁
lock.Unlock()
}
func main(){
// 开启20个协程
for i:=1;i<=20;i++{
go caltulateFactorial(i)
}
// 等待10s后输出结果
time.Sleep(5 * time.Second)
lock.Lock()
for k, v := range myMap{
fmt.Println(k,"的阶乘 =", v)
}
lock.Unlock()
}
结果
PS D:\VSCodeProjects\GoProject\src\main> go build -race main.go
PS D:\VSCodeProjects\GoProject\src\main> .\main.exe
9 的阶乘 = 362880
13 的阶乘 = 6227020800
15 的阶乘 = 1307674368000
17 的阶乘 = 355687428096000
19 的阶乘 = 121645100408832000
20 的阶乘 = 2432902008176640000
4 的阶乘 = 24
10 的阶乘 = 3628800
11 的阶乘 = 39916800
12 的阶乘 = 479001600
16 的阶乘 = 20922789888000
1 的阶乘 = 1
3 的阶乘 = 6
8 的阶乘 = 40320
14 的阶乘 = 87178291200
2 的阶乘 = 2
5 的阶乘 = 120
6 的阶乘 = 720
7 的阶乘 = 5040
18 的阶乘 = 6402373705728000
PS D:\VSCodeProjects\GoProject\src\main>