第四,带有递归的Hofstadter Q序列

时间:2016-07-29 20:32:55

标签: recursion sequence forth gforth oeis

我尝试使用递归定义实现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

1 个答案:

答案 0 :(得分:4)

我意识到自己的错误。在调用n之后,我不需要保留Q,但我已经使用dup足够的时间来保留每次调用。每次调用后,这会在堆栈上留下n,导致输出不正确。我删除了其中一个dup,然后就可以了。