我正在解决这个欧拉计划问题。首先,我尝试了蛮力,花了0.5秒,然后我尝试了动态编程来利用记忆,期望有巨大的改进,但我惊讶地发现结果是0.36秒。
经过一点点谷歌搜索,我发现你不能在函数(find_collatz_len)中使用指针来访问外部地图数据(备忘录)。因此,每次运行下面的函数时,它都会复制整个字典。这听起来像是对处理器能力的巨大浪费。
我的问题是,什么是解决方法,以便我可以使用指向函数外部映射的指针来避免复制。
这是我的丑陋代码:
package main
//project euler 014 - longest collatz sequence
import (
"fmt"
"time"
)
func find_collatz_len(n int, memo map[int]int) int {
counter := 1
initital_value := n
for n != 1 {
counter++
if n < initital_value {
counter = counter + memo[n]
break
}
if n%2 == 0 {
n = int(float64(n)/2)
} else {
n = n*3+1
}
}
memo[initital_value] = counter
return counter
}
func main() {
start := time.Now()
max_length := 0
number := 0
current_length := 0
memo := make(map[int]int)
for i:=1; i<1_000_000; i++ {
current_length = find_collatz_len(i, memo)
if current_length > max_length {
max_length = current_length
number = i
}
}
fmt.Println(max_length, number)
fmt.Println("Time:", time.Since(start).Seconds())
}
胡说叔叔
相关分类