两步算法:将输入字符串映射到输出字符串

时间:2013-07-17 21:53:06

标签: python algorithm

我一直在困惑如何在Python中使用某个函数。该函数将正整数取整为其他正整数,如下所示:

Phi_m(n2) = Phi_m(m*n + r) = m*x[n] + r*(x[n + 1] - x[n])

上述术语均为整数值,定义如下:

n2 = the (n2)th slot of the output string

m = a fixed positive integer

n = some multiple of m such that n*m is less than or equal to n2

r = a remainder term to fill in the amount missing from n*m in decomposing n2

x[n] = the element in the [n1]th slot of the input string

x[n + 1] = the element in the [n1 + 1]th slot of the input string

一般来说,我们从一串数字开始,比如0,1,1,2,3,3,最后得到一串(k + 1)m-1项,其中k是你的术语数开始于,不包括0.要使用该函数我们首先修复m,比如说m = 2.现在我们用m来分解n2,其中n2表示输出序列的“槽”。说n2 = 5。然后我们问'输出字符串的第五个'插槽'是什么'。在这种情况下,我们的总输出字符串将是长度(5 + 1)2 + 1。请注意,我们不计算0 - 它始终存在,并且就我们的目的而言是第0个术语,因此我们有5个初始术语。为了回答我们关于槽中的内容的问题,我们将5 = 2 * 2 + 1作为我们的分解。现在我们已经分解了,我们可以应用我们的函数:

F(x(5)) = F(x(2*2+1)) 2x[2] + 1(x[3] - x[2]). 

问题是,对于Python来说,它必须知道如何分解每个数字。所以它知道2是固定的,并且知道2 * 3太多所以选择2 * 2。然后它必须知道这个太少并且添加余数1.只有一旦它完成,它实际上可以抓住n = 5.也就是说,它可以运行该函数。很明显,一旦它知道如何做到这一点,它就可以贯穿我们范围内的每一个n,但我真的不确定如何编程这个函数的内容。

现在回答一些问题:x是一个功能吗?一个列表?一个号码? x [n]本质上是一个列表。

当你说“输入字符串的值”时,你是什么意思? Phi_m的签名是什么?

作用于此列表的函数接受列表中的单个元素,以某种方式为我们分解数字,然后应用您在上面看到的“公式”。从这个意义上讲,它更像是一个两步算法。

如果不清楚,请告诉我。我一定会继续修改,直到对那些阅读有意义。

1 个答案:

答案 0 :(得分:1)

也许这段代码会让你接近答案:

>>> def phi_m(x, m):
...   rtn = []
...   for n2 in range(0, len(x) * m - 2:
...     n = n2 / m
...     r = n2 - n * m
...     rtn.append(m * x[n] + r * (x[n + 1] - x[n]))
...     print 'n2 =', n2, ': n =', n, ' r =' , r, ' rtn =', rtn
...   rtn    
...
>>> x = [0, 1, 1, 2, 3, 3]
>>> phi_m(x, 2)
n2 = 0 : n = 0  r = 0  rtn = [0]
n2 = 1 : n = 0  r = 1  rtn = [0, 1]
n2 = 2 : n = 1  r = 0  rtn = [0, 1, 2]
n2 = 3 : n = 1  r = 1  rtn = [0, 1, 2, 2]
n2 = 4 : n = 2  r = 0  rtn = [0, 1, 2, 2, 2]
n2 = 5 : n = 2  r = 1  rtn = [0, 1, 2, 2, 2, 3]
n2 = 6 : n = 3  r = 0  rtn = [0, 1, 2, 2, 2, 3, 4]
n2 = 7 : n = 3  r = 1  rtn = [0, 1, 2, 2, 2, 3, 4, 5]
n2 = 8 : n = 4  r = 0  rtn = [0, 1, 2, 2, 2, 3, 4, 5, 6]
n2 = 9 : n = 4  r = 1  rtn = [0, 1, 2, 2, 2, 3, 4, 5, 6, 6]
>>>

您的原始长度公式产生了越界错误,与评论中的错误一样。 m * len(x) - 2显然就是你的意思。