Публикации по теме 'tail-call-optimization'


Оптимизация хвостового вызова
Что такое оптимизация хвостового вызова? Обычно совокупная стоимость владения означает, что вы можете вызывать функцию из другой функции без увеличения стека вызовов. Вам может быть интересно, что такое стек вызовов, а? Согласно MDN, стек вызовов — это механизм, с помощью которого интерпретатор (например, интерпретатор JavaScript в веб-браузере) отслеживает свое место в скрипте, который вызывает несколько функций — какая функция выполняется в данный момент, а какие функции запущены...

Оптимизация хвостового вызова в ES6 (javascript) на простом языке
Оптимизация хвостовых вызовов (TCO) — это метод, используемый для оптимизации рекурсивных функций за счет предотвращения накопления кадров стека. В ECMAScript 6 (ES6) TCO не требуется, но некоторые движки JavaScript могут предоставлять его ограниченную поддержку. Давайте разберемся с TCO на простом примере простым языком. Рассмотрим функцию для вычисления факториала числа: function factorial(n) { if (n === 0) { return 1; } else { return n * factorial(n - 1); } } В этом..

Вопросы по теме 'tail-call-optimization'

Могут ли программы на функциональных языках чаще иметь переполнение стека?
Я начинаю изучать ocaml и действительно ценю силу рекурсии в языке. Тем не менее, одна вещь, о которой я беспокоюсь, — это переполнение стека. Если ocaml использует стек для вызовов функций, не переполнит ли он в конечном итоге стек? Например,...
665 просмотров

Есть ли техническая причина, по которой C # не выдает хвост? Инструкция CIL?
Возможный дубликат: Почему нет. net / C # устранить хвостовую рекурсию? Возьмите следующий код C #: using System; namespace TailTest { class MainClass { public static void Main (string[] args) {...
1405 просмотров

Есть ли обходной путь для слишком глубоких ошибок на уровне стека в рекурсивных процедурах?
Есть ли обходной путь для ошибок переполнения стека в рекурсивных функциях в Ruby? Скажем, например, у меня есть этот блок: def countUpTo(current, final) puts current return nil if current == final countUpTo(current+1, final) end...
2923 просмотров

Оптимизация хвостового вызова в Racket
Я выполнял SICP упражнение 2.28 и наткнулся на странное поведение следующего кода: (define (fringe tree) (cond ((null? tree) '()) ((not (pair? tree)) (list tree)) (else (append (fringe (car tree)) (fringe (cdr tree)))))) (define...
732 просмотров

Как мне выйти из функции в Лиспе?
Возможно ли в (Common) Lisp перейти к другой функции вместо вызова другой? Я имею в виду, что текущая функция не работает и вызывается другая, без перехода назад через тысячи функций, как будто я сам решаю, выполняется ли оптимизация хвостового...
396 просмотров

Реализует ли Swift оптимизацию хвостового вызова? а в случае взаимной рекурсии?
В частности, если у меня есть следующий код: func sum(n: Int, acc: Int) -> Int { if n == 0 { return acc } else { return sum(n - 1, acc + n) } } Компилятор Swift оптимизирует его до цикла? И так ли это в более интересном случае ниже?...
9382 просмотров
schedule 10.10.2022

Компиляция оптимизации хвостового вызова во взаимной рекурсии между C и Haskell
Я экспериментирую с интерфейсом сторонних функций в Haskell. Я хотел реализовать простой тест, чтобы увидеть, могу ли я выполнить взаимную рекурсию. Итак, я создал следующий код на Haskell: module MutualRecursion where import Data.Int foreign...
310 просмотров

Существует ли шаблон tco с двумя накапливающимися переменными?
Просто для удовольствия ( Project Euler #65 ) я хочу реализовать формулу n_k = a_k*n_k-1 + n_k-2 эффективным способом. a_k равно 1 или (* 2 (/ k 3)) , в зависимости от k . Я начал с рекурсивного решения: (defun...
78 просмотров

Почему gcc выполняет оптимизацию хвостового вызова для одной версии, но не для другой?
Экспериментируя с оптимизацией хвостовых вызовов (tco), я наткнулся на следующий любопытный пример: unsigned long long int fac1(unsigned long long int n){ if (n==0) return 1; return n*fac1(n-1); } на самом деле, я был впечатлен тем,...
205 просмотров

Указание GCC выполнить хвостовой вызов функции
Скажем, у меня есть функция C: unsigned int fact(unsigned int n, unsigned int acc) { if(n > 0) return fact(n - 1, n * acc); return acc; } Есть ли способ сказать GCC, чтобы хвост вызывал рекурсивную функцию, что-то вроде unsigned...
251 просмотров