Man or boy test
Чот болею я, в самом прямом смысле, ОРЗ жуткое... Так что какую-нибудь маленькую абстракцию и валиться...
"Man or boy test" - известный тест из Дональда Кнута, когда он оценивал качество компилятора с ALGOL 60, а цель теста была простой - отличить компиляторы, которые правильно реализуют рекурсию и нелокальные ссылки от тех, которые этого не делают. Сам тест и какие результаты должны получаться есть на странице по ссылке.
Из современных массовых языков, наверное, органичней всего на яваскрипте выглядит, но и то неочевидная обёртка понадобилась, чтобы победить "тяжёлое наследие си-подобных языков":
<script type="text/javascript"> function a(k, x1, x2, x3, x4, x5) { function b() { k--; return a(k, b, x1, x2, x3, x4); } return (k > 0) ? b() : x4() + x5(); } //обёрточка, без неё может и не выйти :) function x(n) { return function () { return n; }; } alert(a(10, x(1), x(-1), x(-1), x(1), x(0))); </script>
Но ведь и на PHP будет в данном случае почти так же выразительно:
<?php function A($k,$x1,$x2,$x3,$x4,$x5) { $b = function () use (&$b,&$k,$x1,$x2,$x3,$x4) { return A(--$k,$b,$x1,$x2,$x3,$x4); }; return $k <= 0 ? $x4() + $x5() : $b(); } echo A(10, function () { return 1; }, function () { return -1; }, function () { return -1; }, function () { return 1; }, function () { return 0; }); ?>
Наверное, и на Питоне тоже.
А на "плюсах", "шарпе" или яве, конечно, куда более замудрённый класс понадобится...
20.09.2018, 21:49 [2096 просмотров]