0

我一直对如何让某个函数在 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,但我真的不确定如何编写此函数的内容。

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

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

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

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

4

1 回答 1

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显然是你的意思。

于 2013-07-18T02:09:03.583 回答