我尝试使用递归定义实现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
成为// This doesn't compile:
//.Where(() => taskAlias.StartDateOverride.Coalesce(() => wiAlias.StartDate) <= end)
//.And(() => taskAlias.EndDateOverride.Coalesce(() => wiAlias.EndDate) >= start)
不按我的预期工作。
是否有一个简单的调整来使这项工作?或者我是否需要使用不同的方法,可能使用.Where(() => taskAlias.StartDateOverride.Coalesce(wiAlias.StartDate) <= end)
.And(() => taskAlias.EndDateOverride.Coalesce(wiAlias.EndDate) >= start)
的变量?
OEIS:A005185
答案 0 :(得分:4)
我意识到自己的错误。在调用n
之后,我不需要保留Q
,但我已经使用dup
足够的时间来保留每次调用。每次调用后,这会在堆栈上留下n
,导致输出不正确。我删除了其中一个dup
,然后就可以了。