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

本文关键字:搜索 位置 函数 递归 | 更新日期: 2023-09-27 18:01:36

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

任何标记给定语言的特定解决方案都是非常受欢迎的。即使更通解的公式是这个问题的目标。

感谢

定义序列规则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为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)

所以最后我可以写

OS(0) = 0

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


到目前为止,我所能得到的是移动群当前索引的公式。我怀疑它可以帮助我确定所需的位置公式pos(n),但不知道如何:((

组索引可表示为:

G (n) =上限(n/D (SS))

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


例子

例如,$n$序列的取值范围是1到12。对OS(n)进行1->1映射的4维移动群(1,1,1,2)的个数为3 = 12/4

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

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

最终答案


%操作符的用法是我所缺少的。最终的递归公式是:

OS(n) =0, n=0

操作系统OS (n - 1) + SS (n) = ((n + D (SR) 1) % D (SR) + 1), n> 0

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

OS(n) =0, n=0

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


由于@GARETH

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

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

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

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


如果你需要模数在1到4的范围内,而不是0到3,使用这个表达式:

(n + 3) % 4 + 1