2013-07-23 1 views
14

Я нашел некоторые объяснения открытой/закрытой рекурсии, но я не понимаю, почему определение содержит слово« рекурсия »или как оно сравнивается с динамической/статической диспетчеризацией. Среди объяснений, которые я нашел, есть:.Почему это называется «открытой (или закрытой) рекурсией?

Open рекурсии Еще одна удобная функция, предлагаемые большинством языков с объектами и классами, является возможность для одного метода тела, чтобы вызвать другой метод того же объекта с помощью специальная переменная, называемая self или, на некоторых языках, this. Специальный поведение «я» заключается в том, что он связан с поздней задержкой, позволяя определенному методу в одном классе вызывать другой метод, который определен ниже, в некоторый подкласс первого. [Ralf Hinze]

... или в Wikipedia:

диспетчерских семантика this, а именно, что метод вызывает на это динамически отправляется, известен как открытой рекурсии, и означает, что они методы могут быть переопределены производными классами или объектами. Напротив, прямая именная рекурсия или анонимная рекурсия функции использует закрытую рекурсию с ранним связыванием.

Я также прочитал StackOverflow вопрос: What is open recursion?

Но я не понимаю, почему слово «рекурсия» используется для определения. Конечно, это может привести к интересному (или опасному) побочному эффекту, если вы используете «открытую рекурсию», выполнив ... метод рекурсивного вызова. Но определения не принимают рекурсивный вызов метода/функции непосредственно во внимание (добавьте «закрытую рекурсию» в определение Википедии, но это звучит странно, поскольку «открытая рекурсия» не относится к рекурсивному вызову).

Вы знаете, почему в определении есть слово «рекурсия»? Это потому, что оно основано на другом определении компьютерной науки, о котором я не знаю? Должно просто сказать «динамическая отправка» не хватит?

ответ

21

Я попытался написать здесь ответ, а затем написал об этом entire blog post. TL; DR является:

Таким образом, если сравнивать реальный объектно-ориентированный язык на более простом языке с только структуры и функции, различия:

  • Все методы могут видеть и звоните друг другу. Порядок, который они определены, не имеет значения, так как их определения являются «одновременными» или взаимно рекурсивные.
  • Базовые методы имеют доступ к полученному объекту получателя (т. Е. Этому или самому себе на других языках), поэтому они не закрываются друг с другом. Это open для переопределенных методов.

Таким образом: открытая рекурсия.

+2

Спасибо! Ваше сообщение в блоге очень ясно и действительно отвечает на мои вопросы.Таким образом, все это происходит из словаря функционального программирования. Также спасибо за ваши рекомендации. –

+0

Мать языков программирования - это лямбда-исчисление, поэтому все относится к функциям. Но ИМХО, фраза «... все исходит из словаря функционального программирования» завышена; трудно понять, почему «открытая рекурсия» должна существовать (ваш вопрос является конкретным примером), не задумываясь о моделях объектов. –

Смежные вопросы