Вопросы по теме 'tail-recursion'
Что такое оптимизация хвостового вызова?
Очень просто, что такое оптимизация обратного вызова?
В частности, какие небольшие фрагменты кода можно применить, а где нет, с объяснением почему?
189566 просмотров
schedule
08.04.2023
Как работает хвостовая рекурсия Haskell?
Я написал этот фрагмент кода и предполагаю, что len является хвостовой рекурсией, но переполнение стека все еще происходит. Что не так?
myLength :: [a] -> Integer
myLength xs = len xs 0
where len [] l = l
len (x:xs) l = len xs...
9436 просмотров
schedule
23.06.2022
Объясните мне, что такое оптимизация хвостовых вызовов и зачем она нужна Python.
Так что, по-видимому, была большая шумиха по поводу того, нуждается ли Python в оптимизации хвостовых вызовов. Это дошло до апогея, когда кто-то отправил Гвидо копию SICP потому что он «не понял». Я в той же лодке, что и Гвидо. Я понимаю...
1594 просмотров
schedule
20.01.2023
Пока или хвостовая рекурсия в F #, что и когда использовать?
Хорошо, только на F #, и вот как я это понимаю сейчас:
Некоторые проблемы рекурсивны по своей природе (построение или считывание древовидной структуры, чтобы назвать только одну), и затем вы используете рекурсию. В этих случаях вы...
4198 просмотров
schedule
19.08.2022
Хвостовая рекурсивная сортировка слиянием в OCaml
Я пытаюсь реализовать хвостовую рекурсивную функцию сортировки списков в OCaml и получил следующий код:
let tailrec_merge_sort l =
let split l =
let rec _split source left right =
match source with
| [] -> (left, right)...
5303 просмотров
schedule
08.04.2022
Предупреждение / ошибка Clojure при сбое оптимизации хвостового вызова
В Scala 2.8.x была добавлена новая аннотация ( @tailrec ), которая выдает ошибку времени компиляции, если компилятор не может выполнить оптимизацию хвостового вызова для аннотированного метода.
Есть ли в Clojure аналогичные возможности по...
707 просмотров
schedule
26.04.2023
Как мне выйти из цикла в Scala?
Как разорвать петлю?
var largest=0
for(i<-999 to 1 by -1) {
for (j<-i to 1 by -1) {
val product=i*j
if (largest>product)
// I want to break out here
else...
213809 просмотров
schedule
04.12.2021
Схема накопительной рекурсии со списками
Как я могу передать список в качестве параметра функции, рекурсивно добавляющей к нему элементы, и оставить его без изменений, когда он выйдет из рекурсии?
Я хочу использовать список на каждом уровне рекурсии со списком, имеющим значения,...
1442 просмотров
schedule
11.06.2023
Вопрос по статье оптимизации хвостового вызова
У меня есть вопрос относительно этой статьи.
Между этим кодом
function odds(n, p) {
if(n == 0) {
return 1
} else {
return (n / p) * odds(n - 1, p - 1)
}
}
и этот код
(function(){
var odds1 = function(n, p, acc) {...
256 просмотров
schedule
14.05.2022
Разве в OCaml нет проверки рекурсии?
Недавно я играл с OCaml и сразу же сделал свою любимую вещь, чтобы проверить, насколько хорошо разработана виртуальная машина/компилятор, и написал рекурсивную программу:
let rec f i =
Printf.eprintf "i = %d\n" i;
f(i+1);;
let () =
f...
1152 просмотров
schedule
10.11.2022
Реализация хвостовой рекурсивной версии функции быстрой сортировки в F#/OCaml
Можно ли реализовать хвостовую рекурсивную версию алгоритма быстрой сортировки (через шаблон продолжения)? И если да, то как это реализовать?
Обычная (не оптимизированная) версия:
let rec quicksort list =
match list with
| [] -> []
|...
3006 просмотров
schedule
24.04.2022
Преобразование рекурсивной функции в хвостовую рекурсию в python
В качестве упражнения я реализовал функцию карты, используя рекурсию в python, следующим образом:
#map function that applies the function f on every element of list l and returns the new list
def map(l,f):
if l == []:
return []...
2596 просмотров
schedule
06.04.2022
Рекурсия по списку s-выражений в Clojure
Чтобы задать некоторый контекст, я изучаю Clojure и разработку Lisp в целом. На моем пути к Lisp я в настоящее время работаю над серией "Little", пытаясь укрепить фундамент в функциональном программировании и решении рекурсивных решений. В...
1783 просмотров
schedule
21.04.2022
Как перевести следующее в хвостовую рекурсивную процедуру?
У меня есть следующее математическое выражение:
; f(n) = f(n - 1) + f(n - 2) where n >= 2
; f(n) = n where n < 2`
Который я перевел в обычный рекурсивный вызов LISP:
(define (f n)
(cond ((< n 2) n)
(else (+ (f (- n...
929 просмотров
schedule
26.06.2022
Почему Scala не оптимизирует хвостовой вызов с помощью try / catch?
В недавнем ответе StackOverflow я дал следующий рекурсивный код:
def retry[T](n: Int)(fn: => T): T = {
try {
fn
} catch {
case e if n > 1 =>
retry(n - 1)(fn)
}
}
Если я добавлю аннотацию @tailrec , я получу:...
1516 просмотров
schedule
10.07.2023
Хвостовая рекурсия в FParsec
Я столкнулся с проблемой парсеров с двумя ветвями рекурсии. Чтобы упростить демонстрацию проблемы, я использую простую грамматику лямбда-исчисления из статья, написанная Лукой Болоньезе в качестве примера:
<expression> ::= <name>...
384 просмотров
schedule
28.07.2023
хвостовая рекурсивная/эффективная функция для подсчета элементов списка (без использования List.count/Seq.count)
Я попытался выполнить хвостовую рекурсивную функцию, которая будет подсчитывать элементы списка, следовал правилам, использовал накопитель, но когда я запускаю ее так:
lstcountr [1..98765432];;
Я получаю это:...
923 просмотров
schedule
26.04.2023
Является ли эта функция F # хвостовой рекурсивной, когда рекурсивная функция вызывается несколько раз внутри функции?
Есть несколько вопросов о хвостовой рекурсивной функции, например: this и this , но не смог найти ничего похожего на следующее.
Насколько я понимаю, функция, оптимизированная для хвостового вызова, должна возвращать накопленное значение в своем...
824 просмотров
schedule
15.03.2022
Как пройти AST с хвостовой рекурсией в Clojure
У меня есть AST ANTLR3, который мне нужно пройти, используя обход в глубину, который я реализовал примерно как следующий Clojure:
(defn walk-tree [^CommonTree node]
(if (zero? (.getChildCount node))
(read-string (.getText node))...
1566 просмотров
schedule
23.06.2022
Как преобразовать эту функцию для использования хвостового вызова
Рекурсивная функция:
let rec listMerge (l1 : 'a list) (l2 : 'a list) =
if l1.IsEmpty then l2
elif l2.IsEmpty then l1
else l1.Head :: l2.Head :: listMerge l1.Tail l2.Tail
Теперь, если я не ошибаюсь, это...
509 просмотров
schedule
21.07.2023