由于您没有描述您要解决的问题,因此该答案仅基于您发布的 F# 代码。我同意功能版本有点混乱,但我相信它可以更清晰。我不太明白嵌套for
在你的命令式解决方案中循环:
for increment_index in {1..4} do
current <- current + increment
total <- total + current
你没有使用increment_index
对于任何东西,所以你可以乘以increment
and current
四倍并得到相同的结果:
total <- total + 4*current + 10*increment
current <- current + 4*increment
那么你的命令式解决方案就变成了:
let mutable total = 0
let mutable increment = 2
let mutable current = 1
for spiral_layer_index in {1..(dimensions- 1) / 2} do
total <- total + 4*current + 10*increment
current <- current + 4*increment
increment <- increment + 2
total
如果你将其重写为递归函数,它就会变成:
let rec loop index (total, current, increment) =
if index > (dimensions - 1) / 2 then total
else loop (index + 1) ( total + 4*current + 10*increment,
current + 4*increment, increment + 2 )
let total = loop 1 (0, 2, 1)
同样的事情也可以写成使用Seq.fold
像这样(这更加“函数式”,因为在函数式编程中,您仅使用递归来实现基本功能,例如fold
然后可以重复使用):
let total, _, _=
{1 .. (dimensions - 1) / 2} |> Seq.fold (fun (total, current, increment) _ ->
(total + 4*current + 10*increment, current + 4 * increment, increment + 2)) (0, 1, 2)
注意:我不确定这是否真正实现了您想要的。这只是您的命令式解决方案的简化,然后使用递归函数重写它......