Публикации по теме '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 просмотров
schedule
18.07.2022
Есть ли техническая причина, по которой C # не выдает хвост? Инструкция CIL?
Возможный дубликат: Почему нет. net / C # устранить хвостовую рекурсию?
Возьмите следующий код C #:
using System;
namespace TailTest
{
class MainClass
{
public static void Main (string[] args)
{...
1405 просмотров
schedule
16.11.2022
Есть ли обходной путь для слишком глубоких ошибок на уровне стека в рекурсивных процедурах?
Есть ли обходной путь для ошибок переполнения стека в рекурсивных функциях в Ruby?
Скажем, например, у меня есть этот блок:
def countUpTo(current, final)
puts current
return nil if current == final
countUpTo(current+1, final)
end...
2923 просмотров
schedule
23.10.2022
Оптимизация хвостового вызова в 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 просмотров
schedule
04.03.2023
Как мне выйти из функции в Лиспе?
Возможно ли в (Common) Lisp перейти к другой функции вместо вызова другой? Я имею в виду, что текущая функция не работает и вызывается другая, без перехода назад через тысячи функций, как будто я сам решаю, выполняется ли оптимизация хвостового...
396 просмотров
schedule
20.11.2022
Реализует ли 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 просмотров
schedule
29.09.2022
Существует ли шаблон tco с двумя накапливающимися переменными?
Просто для удовольствия ( Project Euler #65 ) я хочу реализовать формулу
n_k = a_k*n_k-1 + n_k-2
эффективным способом. a_k равно 1 или (* 2 (/ k 3)) , в зависимости от k .
Я начал с рекурсивного решения:
(defun...
78 просмотров
schedule
26.04.2023
Почему gcc выполняет оптимизацию хвостового вызова для одной версии, но не для другой?
Экспериментируя с оптимизацией хвостовых вызовов (tco), я наткнулся на следующий любопытный пример:
unsigned long long int fac1(unsigned long long int n){
if (n==0)
return 1;
return n*fac1(n-1);
}
на самом деле, я был впечатлен тем,...
205 просмотров
schedule
24.05.2023
Указание 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 просмотров
schedule
27.04.2023