四、带递归的Hofstadter Q序列
Forth, Hofstadter Q Sequence with Recursion
我正在尝试使用递归定义实现 Hofstadter's Q Sequence:
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
我意识到我的错误。我不需要在调用 Q
后保留 n
,但我已经使用了足够多的 dup
来在每次调用时保留它。这会在每次调用后将 n
留在堆栈中,从而导致输出不正确。我删除了其中一个 dup
,它起作用了。
我正在尝试使用递归定义实现 Hofstadter's Q Sequence:
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
我意识到我的错误。我不需要在调用 Q
后保留 n
,但我已经使用了足够多的 dup
来在每次调用时保留它。这会在每次调用后将 n
留在堆栈中,从而导致输出不正确。我删除了其中一个 dup
,它起作用了。