我试图使用F#尽可能高效地编写一个tetranacci函数,我想到的第一个解决方案确实效率很低。你能帮助我提出一个更好的方案吗?我将如何在线性时间内实现这一目标?
let rec tetra n =
match n with
| 0 -> 0
| 1 -> 1
| 2 -> 1
| 3 -> 2
| _ -> tetra (n - 1) + tetra (n - 2) + tetra (n - 3) + tetra (n - 4)
最佳答案
这是一个tail recursive版本,可编译为大部分循环(其复杂度应为O(n)):
let tetr n =
let rec t acc4 acc3 acc2 acc1 = function
| n when n = 0 -> acc4
| n when n = 1 -> acc3
| n when n = 2 -> acc2
| n when n = 3 -> acc1
| n -> t acc3 acc2 acc1 (acc1 + acc2 + acc3 + acc4) (n - 1)
t 0 1 1 2 n
acc1
对应于tetra (n - 1)
,acc2
对应于tetra (n - 2)
,acc3
对应于tetra (n - 3)
,acc4
对应于tetra (n - 4)
基于the Fibonacci example