2012-01-19 2 views
1

Мне нужен код, который создает логический список, зависит от вставленного списка и количества. Например, когда пользователь дает Список [0,1,2,3,4,5,6,7,8,9,10] и count = 2 затем код делает bool List [true, false , правда, ложь, истина, ложь, истина, ложь, истина, ложь, правда]Как создать логический список boolean зависит от вставленных счетчиков и списка в f #

Когда кол = 3 то это сделает List его [истинного, ложный, ложный, истинный, ложный, ложным, истина, ложь, ложь, истина, ложь]

Если счетчик = 4 затем [истина, ложь, ложь, ложь, истина, ложь, ложь, ложь, правда, false] и т. д.

Я написал следующий код, но я думаю, что этот код неверен, я новичок в f #, поэтому мне нужна помощь. Благодарю.

let Group (s1 : List) (c : int) = 
     let lenght = List.length(s1) 
     (lenght) 
      let rec MakeBool (count : int) (boolist : List) = 
       while lenght > 0 do 
        if lenght % count = 0 then boolist = true::boolist 
        if lenght % count <> 0 then boolist = false::boolist  
        lenght = lenght - 1 
        MakeBool count boolist 
+0

Это может быть стоит расширять свой вопрос, чтобы сказать * почему * вы хотите это сделать. У вас есть правильные ответы, но, давая немного контекста, вы можете получить некоторые предложения об избежании этой (довольно странной) конструкции. – Kit

ответ

3

Использование функции высокого порядка (рекомендуется):

let group ls c = 
    ls |> List.mapi (fun i _ -> i%c = 0) 

добавить собственные функции:

let group ls c = 
let length = List.length ls  
let rec makeBool count acc = 
    if count = length then acc // Come to the end of ls, return the accummulator 
    elif count%c=0 then // Satisfy the condition, prepend true to the accummulator 
    makeBool (count+1) (true::acc) 
    else // Otherwise prepend false to the accummulator 
    makeBool (count+1) (false::acc) 
List.rev (makeBool 0 []) // The accummulator is in backward order, reverse it 
+0

Примечание: ваши решения предполагают, что он хочет модулировать по индексу в списке, а не по значению. Учитывая его список примеров, это может быть то, что он хочет, но я подумал, что стоит отметить, прежде чем он будет отмечен ... :) – Benjol

1

Нравится?

let Group l c = [ for l' in 0..l -> (l' % c) = 0 ] 

signatue является Group : int -> int -> bool list

  • [a..b] создает список целых чисел от а до Ь (оба включительно)
  • [для й в a..b -> е (x)] делает то же самое, но применяет f к каждому элементу.
  • (a% c) = 0 просто проверяет, является ли a модулем c.

// H

+0

Оба решения отличные, спасибо за ваши отзывы. Ребята :-) –

Смежные вопросы