2015-02-13 1 views
0

Я знаю, что этот вопрос звучит немного сложнее, но эй, я нахожу, что ничего подобного не имеет здесь. Хорошо, так как в моем предыдущем вопросе я упомянул, что я новичок в F #. Благодаря нескольким программистам-помощникам здесь помогает решить мою функцию в моем предыдущем вопросе. Итак, у меня есть текстовый файл, содержащий более 20 строк, и я хочу распечатать строки с годами и средними значениями всех элементов с каждого года и его элементов.Как распечатать строки рекурсивно из текстового файла вместе со средним значением общих элементов из строки?

Пример строки текста

2009 1.3  3.51 6.76 5.80 4.48 5.47 2.06 4.3 0.54 7.69 1.27 2.9 
2008 3.53 3.71 1.88 2.46 4.63 4.88 4.53 1.51 10.83 2.7 1.28 6.51 
2007 2.88 2.19 3.55 3.95 2 3.1 4.18 8.76 1.91 2.01 1.67 3.54 
2006 3.48 1.33 3.16 3.87 3.19 3.87 4.24 7.12 4.32 6.63 2.97 3.37 
2005 5.32 2.41 1.76 1.63 1.78 1.07 2.07 1.44 2.68 1.14 2.15 1.38 
2004 1.09 0.75 3.93 1.9 5.57 2.94 4.46 5.01 0.86 2.42 5.02 1.75 

....

Теперь у меня есть пара функций, чтобы показать вам. К сожалению, моя функция печати выводит только первую строку.

let rec print year values = 
    if values = [] then 
    () 
    else 
    printfn "" 
    printfn "%A: %A" year values 

и вторая функция, которая делает сумму элементов отлично, но я не могу управлять, чтобы получить его, чтобы разделить его на 12 элементов должным образом.

let sum (values: double list) = 
let rec sum values accum = 
    match values with 
    | [] -> accum 
    | head :: tail -> sum tail (accum + head)/12.0 // would 12.0 work right? 
sum values 0.0 

в основных

let (year, values) = ParseLine file.Head 
    printfn "%A: %A" print (year (sum values)) // year gets the error, according to visual studio 
+0

Это напоминает мне проект, который я сделал с XSLT. Правильная корректность звучит отлично, пока вы не узнаете, насколько противоречивы функциональные языки. Удачи. –

+2

Я подозреваю, что деление на 12 должно быть 'sum tail (accum + head/12.0)'. Или вы можете просто сделать '[] -> accum/12.0' –

+0

Он работает, спасибо! – CR9191

ответ

0

Благодаря Джон Палмер, который разместил быстрое решение. фиксированный код

let sum (values: double list) = 
let rec sum values accum = 
    match values with 
    | [] -> accum 
    | head :: tail -> sum tail (accum + head/12.0) 
sum values 0.0 
Смежные вопросы