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 08:12 pm (UTC)Нет, дело не в лимитах. try/finally прячет except Exception: pass. Что, в свою очередь, означает, что вывод зависит от глубины стека на котором случился exception, что определяет последовательность -1 и +1.
Т.е. у нас действительно нет детерминизма, он он происходит из-за разной глубины стека (внешнего side cause). Хотя всё равно выглядит странно.