【问题标题】:Searching for a positional function in recursive formula在递归公式中搜索位置函数
【发布时间】:2011-07-10 16:52:44
【问题描述】:

首先请注意,我的英语在这里不是最好的。如果有人有兴趣帮助我解决这个问题并希望我更详细地说明一些事情,请不要询问更多细节。

非常感谢任何标记给定语言的特定解决方案。即使在公式方面更一般的解决方案是这个问题的目标。

谢谢


让我们定义Sequence Rule SR,一个固定的整数序列:

SR = (a, b, c, d, ..)


例子

SR = (1, 2, 3, 5)

让 Shifting Sequence rule SS 将 SR 得到的序列定义为:

SS = (a-0,b-a,c-b,d-c,..-d)


例子

(1-0, 2-1, 3-2, 5-3) = (1, 1, 1, 2)

移位序列规则SS应根据以下递归公式计算输出序列OS:

OS(n) = 0, n=0

OS(n) = OS(n-1) + SS(i), n>0

其中 i 是 n 在当前子群 SS 中的位置。


例子

OS(n) = (1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 15..)

n=(1,2,3,4,5,6,7,8,9,10,11,12,..).

OS(0) = 0
OS(1)  = OS(0)  + SS(1) = 0 + 1  = 1
OS(2)  = OS(1)  + SS(2) = 1 + 1  = 2
OS(3)  = OS(2)  + SS(3) = 2 + 1  = 3
OS(4)  = OS(3)  + SS(4) = 3 + 2  = 5
OS(5)  = OS(4)  + SS(1) = 5 + 1  = 6
OS(6)  = OS(5)  + SS(2) = 6 + 1  = 7
OS(7)  = OS(6)  + SS(3) = 7 + 1  = 8
OS(8)  = OS(7)  + SS(4) = 8 + 2  = 10
OS(9)  = OS(8)  + SS(1) = 10 + 1 = 11
OS(10) = OS(9)  + SS(2) = 11 + 1 = 12
OS(11) = OS(10) + SS(3) = 12 + 1 = 13
OS(12) = OS(11) + SS(4) = 13 + 2 = 15

我实际上缺少的是(无法获得)是n 在相关移位组中的当前位置,仅给定n,这样:

pos(n)=i -> S(pos(n)) = S(i)

终于可以写了

操作系统(0) = 0

OS(n) = OS(n-1) + SS(pos(n))


到目前为止,我能得到的是一个换档组当前索引的公式。我怀疑它可以帮助我确定想要的位置公式 pos(n),但不知道如何:((

组索引可以表示为:

G(n)=天花板(n/D(SS))

其中D(SS)是SS的维数,即序列规则中的元素个数。


例子

例如 $n$ 序列的范围是 1 到 12。维度 4 的移位组 (1,1,1,2) 对 OS(n) 进行 1->1 映射的数量是 3 = 12/4

n=9 的分组索引可以计算为:

 G(9) = ceiling(n/D(SR)) = ceiling(9/4) = 3

最终答案


% 运算符的用法是我所缺少的。最终的递归公式为:

OS(n) = 0, n=0

OS(n) = OS(n-1) + SS((n + D(SR)-1) % D(SR) + 1), n>0

或者使用纯数学公式(以及上面组索引的定义):

OS(n) = 0, n=0

OS(n) = OS(n-1) + SS((n + D(SR)-1 - (D(SR) * G(n)) + 1), n>0


感谢@GARETH

【问题讨论】:

    标签: c# ruby algorithm haskell


    【解决方案1】:

    这个问题很难理解,但我认为您正在寻找modulus 操作。

    序列SS有4个元素,所以pos(n)是n模4。

    此操作可以在许多编程语言(包括 C# 和 Ruby)中通过 % 运算符计算,在 Haskell 中通过 mod 函数计算。


    如果您需要模数在 1 到 4 而不是 0 到 3 的范围内,请使用以下表达式:

    (n + 3) % 4 + 1
    

    【讨论】:

    • 是的,余数是(几乎)想要的功能。唯一的问题是当余数为0 时,它应该返回最新的位置。例如9%4=1 正确。但是12%4=0,而在我的情况下,我想要4。你认为是否有可能逃避条件检查而只需要一个数学公式?
    • 感谢您的出色回答。你能够理解我的难题并给出正确的公式。只要我的代表允许,我愿意投票。
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2013-07-25
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多