Crazy python
Jul. 20th, 2022 07:16 pmФункция выглядит как вычислимая примитивно-рекурсивная, но на самом деле невычислимая общерекурсивная!
Доказательство
def foo(i):
if i < 0 or i > 10:
return i
try:
print(f"{i} - 1")
return foo(i-1)
finally:
print(f"{i} + 1")
return foo(i+1)
print(foo(5))
На самом деле эта функция - чистое UB в питоне. После долгих лет рассказа о том, что в питоне нет UB.
Вот более интересный генератор последовательностей на той же базе.
def foo(i):
if i < 0 or i > 10:
return i
print(i, end='', sep='')
try:
return foo(i-1)
finally:
return foo(i+1)
print(foo(5))
Чем не генератор случайных чисел?
no subject
Date: 2022-07-20 05:42 pm (UTC)Ну кек бы условие «базы рекурсии» поменялось — было
< 0, стало< 1. Теперь такая же нетерминированная рекурсия между foo(2) и foo(1) с заходом в foo(0) (которого не видно, потому что он возвращает 0 без print’а).no subject
Date: 2022-07-20 08:12 pm (UTC)Нет, дело не в лимитах. try/finally прячет except Exception: pass. Что, в свою очередь, означает, что вывод зависит от глубины стека на котором случился exception, что определяет последовательность -1 и +1.
Т.е. у нас действительно нет детерминизма, он он происходит из-за разной глубины стека (внешнего side cause). Хотя всё равно выглядит странно.