Поскольку вы не описали проблему, которую пытаетесь решить, этот ответ основан только на опубликованном вами коде F #.Я согласен, что функциональная версия немного грязная, но я думаю, что она может быть понятнее.Я не совсем понимаю вложенный цикл for
в вашем императивном решении:
for increment_index in {1..4} do
current <- current + increment
total <- total + current
Вы не используете increment_index
для чего-либо, поэтому вы можете просто умножить increment
и 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)
ПРИМЕЧАНИЕ: я не уверен, что это действительно реализует то, что вы хотите.Это просто упрощение вашего императивного решения, а затем переписать его с помощью рекурсивной функции ...