Ваш язык имеет максимальную глубину рекурсии (MRD)?
Допустим, у вашего языка MRD = 500
Напишите код, который находит глубину рекурсии и выводит точное значение
Для приведенного выше случая ваша программа (или функция) должна вывести 500
Код-Гольф Самый короткий ответ побеждает!
Ответы:
Mathematica, 15 байт
¯ \ _ (ツ) _ / ¯
Попробуйте онлайн!
источник
Python 3 , 40 байт
Попробуйте онлайн!
Не просто читая это из встроенного. Мы начинаем с 2, а не с 1, потому что предложение исключение запускается на один уровень до ошибок. Конечно, это меньше на байт в Python 2.
источник
JavaScript (Babel) ,
353329 байтПопробуйте здесь , или используйте фрагмент ниже, чтобы проверить его с
eval
вместоdo
.Порт Japt , 24 байта
Не стоит публиковать это как отдельное решение, поскольку оно, по сути, идентично.
Проверь это
объяснение
Сам по себе JavaScript не имеет предела рекурсии как такового, скорее, ограничение накладывается интерпретатором (то есть браузером) - хорошо, что мы определяем языки их интерпретатором здесь! Среди прочих факторов, предел может варьироваться в зависимости от браузера и доступной памяти, на который влияют выполняемые операции. Следующий фрагмент иллюстрирует этот последний момент, используя 5 различных версий этого решения, которые я прошел. Как видно из последних 2 тестов, в Chrome, по крайней мере, даже порядок операций может иметь значение.
Учитывая это, мы не имеем удобства для работы с константой или методом. Вместо этого мы собираемся создать функцию, которая будет вызывать себя непрерывно, прежде чем, в конце концов, отключится. В простейшей форме это:
Но это не очень полезно для нас в этом вызове, поскольку он только выдает ошибку переполнения без указания того, сколько раз
f
вызывал сам. Мы можем избежать ошибки,try
вызываяf
непрерывный вызов иcatch
вызывая ее, когда она не работает:Нет ошибки, но все равно нет возвращаемого значения того, сколько раз функции удалось вызвать себя до сбоя, потому что на
catch
самом деле ничего не происходит. Давайте попробуем оценитьtry / catch
утверждение:Теперь мы получили возвращаемое значение (и, поскольку это кодовый гольф, мы сэкономили несколько байтов по сравнению с фактическим
return
). Возвращаемое значение, тем не менее,undefined
опять же, потомуcatch
что ничего не делает. К счастью для нас-~undefined==1
и-~n==n+1
так, посылая-~
перед вызовомf
, мы, по сути, получили-~-~ ... -~-~undefined
, с другим-~
перед каждым вызовом, давая нам количество звонковf
.источник
f=_=>eval('try{-~f()}catch(e){}')
Mathematica (без встроенного), 20 байтов
Пропуск
;
будет вычислять1+$IterationLimit
(вероятно, потому что Mathematica оптимизирует функцию хвоста). В качестве альтернативы0 //. x_ -> x + 1
рассчитайтеReplaceRepeated
значение по умолчаниюMaxIteration
, то есть65536
(которое больше, чем оба значения выше).(Это фрагмент кода, который оценивает результат. Однако есть и другое решение Mathematica)
источник
J, 8 байт
Попробуйте онлайн!
Итак, я не знаю, как выполнить глагол без какого-либо ввода, и после небольшого поиска (а также личной интуиции) кажется, что это невозможно. Если это так, пожалуйста, дайте мне знать, как это сделать, и я либо удалю, либо обновлю свой ответ. Хотя на самом деле не имеет смысла давать глаголу никакой информации. В свете этого, данная функция ожидает
0
, по умолчанию «пустой» ввод для целых чисел. Я, вероятно, могу изменить его, чтобы использовать пустой массив (0$0
), если вы считаете, что это более подходящим.Редактировать: OP позволил функции принимать 0.
объяснение
Это вызывает себя рекурсивно, добавляя 1 к входу (ожидаемый 0), пока он не достигнет ошибки стека. Когда он ошибается, он вызывает неблагоприятное (
]
-правильную идентичность) на входе, которая просто 0.Кстати, место необходимо .
источник
(1+$: ::]) 0
Python 3 ,
4132 байтаПопробуйте онлайн!
Сохранено 9 байт благодаря @FryAmTheEggman!
34 байта
35 байт
Последние 2 - благодаря @totallyhuman
источник
C (gcc, Linux x64),
180133 байта-4 байта благодаря @scottinet
Попробуйте онлайн!
Устанавливает обработчик SIGSEGV (сигнал 11) с альтернативным стеком сигналов (минимальный размер
MINSIGSTKSZ
- 2 КБ, флагSA_ONSTACK
- 0x08000000), затем вызывает рекурсивно функцию без аргументов и без локальных переменных, пока стек не переполнится. Интересно, что максимальная глубина рекурсии зависит от трассы, возможно, из-за ASLR.Конечно, максимальная глубина рекурсии в C зависит от множества факторов. В типичной 64-битной системе Linux размер стека по умолчанию составляет 8 МБ, а выравнивание стека - 16 байтов, поэтому вы получаете глубину рекурсии около 512 КБ для простых функций.
Также обратите внимание, что вышеприведенная программа не работает
-O2
из-за оптимизации хвостового вызова.источник
c
и вызываяexit
иsigaction
как параметры. Это не вносит заметной разницы в результат: ссылкаJava 8,
13151484743 байта-80 байт благодаря @Nevay . Я попробовал метод вместо программы, но сделал ошибку, так что получилась полная программа ... Теперь это метод.
-3 байта благодаря @Neil , используя
finally
вместоcatch(Error e)
.-5 байт благодаря @Nevay снова.
Объяснение:
Попробуй это здесь.
источник
int c(){try{return-~c();}catch(Error e){return 1;}}
int c(){int n=1;try{n=-~c();}finally{return n;}}
сохраняет 3 байта, но дает мне другой ответ?int c(){int n=1;try{n+=c();}finally{return n;}}
int d;int c(){try{c();}finally{return++d;}}
Октава, 19 байт
Использование:
источник
R ,
322618 байт-8 байт благодаря Свену Хоэнштейну :
$
мы сделаем частичное совпадение, поэтому мы можем просто использоватьexp
вместо полногоexpressions
.options
Команда также может быть использована для установки глубины рекурсии, то естьoptions(expressions=500)
за 500.Попробуйте онлайн!
источник
ressions
из-за частичного совпадения с$
.Октава ,
252220 байт2 байта удалены благодаря предложению Sanchises
Анонимная функция, которая выводит значение.
Попробуйте онлайн!
источник
()
, так какmax_recursion_depth
это также функция.@
чтобы сохранить его отличным (определяя функцию, а не REPL'ing результат).disp
(я бы включил это, но это мое личное мнение о Octave REPL, и я не уверен в каком-либо мета-консенсусе по этомузш, 24 байта
Попробуйте онлайн! (См. Под отладкой)
Баш, 24 байта
Попробуйте онлайн! (См. Под отладкой)
ksh93, 27 байт
Попробуйте онлайн! (См. Под отладкой)
тире, 27 байт
Попробуйте онлайн! (Превышает выходные данные отладки tio, запустите его в своей собственной оболочке)
источник
i=0
иecho
не быть включены в ваш счетчик байтов?Луа , 52 байта
Попробуйте онлайн!
источник
f
инpcall
.--
вы сможете подтвердить, что это все еще рекурсивный вызов без оптимизацииq / kdb +, 16 байт
Решение:
Пример:
Объяснение:
Попробуйте повторить, увеличьте x на единицу каждый раз, если ошибка, верните x.
источник
Excel-VBA, 26 байт
Не рекурсивная глубина сама по себе, это фактически выводит максимальное количество итераций для ячейки на листе Excel. Учитывая, что вывод относится к языку, отличному от языка, на котором это написано, возможно, это более уместно:
Excel + Excel-Vba, 3 + 38 = 41 байт
Как это можно назвать из клетки с
Для VBA без встроенного:
Excel-VBA,
534440 байт-9 как переменную больше не нужно инициализировать или печатать
-4, так как выполнение кода больше не нужно прекращать, чтобы избежать нескольких отпечатков
Вызов с s в ближайшем окне, вывод в ячейку A1 рабочего листа
(предупреждение требует времени для запуска,
Application.ScreenUpdating = False
сначала добавьте )источник
Луа ,
4537 байтПопробуйте онлайн!
Я не знаю, какое значение инициализировать, так
x
как я не знаю, сколько существует промежуточных вызовов ...источник
Clojure,
725548 байтов-23 байта, избавляясь от атома
-7 байт благодаря @madstap. Перешел на использование
fn
сноваdef
и#()
, иpr
сноваprintln
.Написал и протестировал на моем телефоне. Приложение Clojure REPL дало мне глубину 13087.
Основное решение. Рекурсировать до тех пор, пока не будет выброшено SO, увеличивая счетчик на каждого рекурса. Когда он брошен, значение счетчика печатается.
источник
pr
вместоprintln
. Также -2 байта, делая fn таким:((fn f[x](,,,))0)
вместо(def f #(,,,))(f 0)
.VBA, любой тип,
4139 байтВызовите с помощью
?A()
окна «Немедленно» или как функцию листа.Замечания: Возвращает 4613 в Excel-VBA, в то время как ответ @Greedo возвращает 3666 в моей системе (максимальное значение должно быть максимальным). Видимо, также различается между программами Office (Access-VBA возвращает 4622, Word-VBA 4615)
Редактировать: Угадай, VBA автоматически добавляет паразиты, поэтому удалил их.
источник
Pyth - 9 байт
Если я могу запустить его, как ответ J выше, это будет 7 байт, потому что вы можете удалить последний
yZ
.Попробуйте это онлайн здесь .
источник
764
, но вы правы, большую часть времени это не дает результата.Далее 48 байтов
Циклы, пока он не достигнет предела.
Попробуйте онлайн
источник
Tcl , 18 байт
Попробуйте онлайн!
recursionlimit
может быть сокращено доr
Tcl , 31 байт
Попробуйте онлайн!
источник
Tcl , 49 байт
Попробуйте онлайн!
источник
Рубин, 39 байт
Подавление сообщения об ошибке немного короче, чем его спасение, так как по умолчанию
rescue
не ловитSystemStackError
.Есть более приятный ответ, если я могу вывести в унарном виде, представляющий
n
с n последовательных символов новой строки:Рубин, 35 байт
источник
Желе , 18 байт
:( *
Попробуйте онлайн!
Как?
* Насколько мне известно, Jelly:
(1) устанавливает предел рекурсии Python до установки большей части своего собственного интерпретатора и синтаксического анализа кода для запуска; и
(2) не может перехватывать ошибки Python.
Я не уверен, существует ли способ либо надежно оценить предел рекурсии, либо распечатать его при его обнаружении, кроме как фактически спросить Python, какое значение было установлено ( Хотелось бы посмотреть, можно ли это сделать, хотя!) Вот что делает код здесь:
источник