Я пытаюсь реализовать Q-последовательность Хофштадтера, используя рекурсивное определение:
Q(1) = 1
Q(2) = 1
Q(n) = Q(n - Q(n-2)) + Q(n - Q(n-1)) for n > 2
Я получаю неправильный результат для n > 3
. Вот что у меня есть до сих пор:
: Q recursive
dup 3 <
if
drop 1
else
dup dup 2dup 2 - Q - Q -rot 1- Q - Q +
then ;
Попробуйте в Интернете: http://ideone.com/PmnJRO (изменение: теперь фиксированная, правильная реализация)
Я думаю, что это не работает, потому что после каждого вызова Q
в стек добавляются значения, где n
больше, чем 2
, из-за чего -rot
работает не так, как я ожидал.
Есть ли простая настройка, чтобы заставить это работать? Или мне нужно использовать другой подход, возможно, используя переменную для n
?
OEIS: A005185