在递归公式中搜索位置函数

时间:2011-07-06 22:33:31

标签: c# ruby algorithm haskell

首先要注意我的英语不是最好的。如果有人有兴趣帮助我解决这个问题,并希望我更好地了解一些事情,那么请不要提出更多细节。

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

谢谢


设定序列规则SR,一个固定的整数序列:

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


示例

SR = (1, 2, 3, 5)

让定义移位序列规则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是当前子组SS中n的位置。


实施例

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的相关转移组中(1,1,1,2)的当前位置,这样:

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

所以最后我可以写

OS(0)= 0

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


到目前为止,我能够得到的是当前转变组指数的公式。我怀疑它可以帮助我确定想要的位置公式 pos(n),但不知道如何:((

组索引可表示为:

G(N)=天花板(N / d(SS))

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


实施例

例如,$ n $序列的范围是1到12.维度4的移位组3 = 12/4的数量为{1}的1> 1映射为n=9

G(9) = ceiling(n/D(SR)) = ceiling(9/4) = 3 的分组索引可以计算为:

%

最终答案


{{1}}运算符的使用是我所缺少的。最后的递归公式是:

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

1 个答案:

答案 0 :(得分:4)

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

序列SS有4个元素,因此pos( n n 模4。

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


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

(n + 3) % 4 + 1