История изменений
Исправление
gh0stwizard,
(текущая версия)
:
ну вот, видишь — ты начинаешь понимать... Действительно, (* n (factorial (- n 1))) — новая функция. Сконструированная из старой.
Я тут влезу в ваш спор, потому как осилил лишь половину треда. Объясню на пальцах (хоть лисп не знаю): код на си, который был в начале, аля классическая рекурсия свалится через н-десять циклов, ИБО стек процессора будет забит, в простонародье stack overflow. В отличие от такого описания, код на лиспе делает туже рекурсию, но не на стеке! Ибо никто бы не стал изобретать такой язык :) Аналог на Си делается через создание новой ссылки на функцию и все вычисления производятся в куче. Это один из вариантов. Другой вариант: выход из функции с подсчитанным промежуточным значением и далее снова вход в рекурсию, аля с помощью защищенного счетчика внутри функции факториала.
Что касается вычисления x*y*z это можно узнать через вывод асмоского кода и зависит от компилятора. Точно также в зависимости от лисповского/хаскельского интерпретатора/компилятор выходной код будет разным.
Исправление
gh0stwizard,
:
ну вот, видишь — ты начинаешь понимать... Действительно, (* n (factorial (- n 1))) — новая функция. Сконструированная из старой.
Я тут влезу в ваш спор, потому как осилил лишь половину треда. Объясню на пальцах (хоть лисп не знаю): код на си, который был в начале, аля классическая рекурсия свалится через н-десять циклов, ИБО стек процессора будет забит, в простонародье stack overflow. В отличие от такого описания, код на лиспе делает туже рекурсию, но не на стеке! Ибо никто бы не стал изобретать такой язык :) Аналог на Си делается через создание новой ссылки на функцию и все вычисления производятся в куче. Это один из вариантов. Другой выход выход из функции с подсчитанным промежуточным значением и далее снова вход в рекурсию, аля с помощью защищенного счетчика внутри функции факториала.
Что касается вычисления x*y*z это можно узнать через вывод асмоского кода и зависит от компилятора. Точно также в зависимости от лисповского/хаскельского интерпретатора/компилятор выходной код будет разным.
Исходная версия
gh0stwizard,
:
ну вот, видишь — ты начинаешь понимать... Действительно, (* n (factorial (- n 1))) — новая функция. Сконструированная из старой.
Я тут влезу в ваш спор, потому как осилил лишь половину треда. Объясню на пальцах (хоть лисп не знаю): код на си, который был в начале, аля классическая рекурсия свалится через н-десять циклов, ИБО стек процессора будет забит, в простонародье stack overflow. В отличие от такого описания, код на лиспе делает туже рекурсию, но не на стеке! Ибо никто бы не стал изобретать такой язык :) Аналог на Си делается через создание новой ссылки на функцию и все вычисления производится в куче.
Что касается вычисления x*y*z это можно узнать через вывод асмоского кода и зависит от компилятора. Точно также в зависимости от лисповского/хаскельского интерпретатора/компилятор выходной код будет разным.