Я застрял при попытке создать функцию, которая будет выполнять следующее:
let p = [1, 2, 4, 2, 1]
let v = 8
, затем я хочу просмотреть элементы в a
, пока не найду индекс i
один, где все элементы вплоть до i
больше или равны v
.Таким образом, в этом случае должно возвращаться 4, потому что 1 + 2 + 4 <8 и 1 + 2 + 4 + 2> 8. Таким образом, в 4-м элементе значение 2 дает общее значение более 8.
(некоторыеСправочная информация: я хочу сделать Монте-Карло, где у меня есть список вероятностей, которые складываются до 1. Затем я передаю случайное число от 0 до 1, чтобы оно выбрало одно из возможных будущих состояний. Простой пример здесь с целыми числами)
То, что у меня пока есть, таково:
let p = [1, 2, 4, 2, 1]
let pick (v:int) (l:int list) =
let rec sub (i:int) (acc:int) (l2:int list) =
match l2 with
| h::t -> if acc+h >= v then i else sub(i+1, acc+h, t)
| _ -> failwith "total list didn't amount to " + v
sub 0 0 l
pick 8 p
Но это дает следующую ошибку в бите sub(i+1, acc+h, t)
:
error FS0001: This expression was expected to have type
int
but here has type
int -> int list -> int
Но я не передаюсама функция sub
, я вызываю , она завершается аргументами, скобками и всем, так почему же она не возвращает int, результат функции?
Как заставить его вернуть результат функции?
Заранее спасибо,
Герт-Ян