0
- 08.03.2013 - 19:31
|
Пробую пример с правосторонней разверткой списка. let a=1L; let b=1000000L; let list=[a..b]; let fold_right func acc list = let rec loop list cont = //сюда мы передаем текущую функцию континуации match list with |[] -> cont acc //а вот и наше ключевое вычисление. |head::tail -> loop tail (fun racc -> cont (func head racc)) loop list (fun x -> x) let reverse = fold_right(fun _ acc -> acc + 1) 0 let sl=reverse(list); System.Console.Write(sl); System.Console.Read(); но поечему то вылетает с переполненеим стека, хотя такой код вреод как должне решить проблемы переполнен стека (взял тсюуда http://habrahabr.ru/post/57503/) подскажите плз, где грабли? | |
1
- 21.03.2013 - 11:46
| Чтобы получить хвостовую рекурсию вычисляемое выражение должно быть последним. Если после вычисляемого выражения будет хоть что-то - компилятор не сможет это оптимизировать без использования стека. | |
| Интернет-форум Краснодарского края и Краснодара |