此问题已在此处有答案:
import scipy.special
s = [1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3,
1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, 1, 2, 1, 3, 1, 2, 1, 4,
1, 2, 1, 3, 1, 2, 1, 5, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3,
1, 2, 1, 7, 1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 5,
1, 2, 1, 3, 1, 2, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, 1, 2, 1, 3,
1, 2, 1, 4, 1]
r = []
for n in range(20):
result = 1
for k in range(n-1):
result += (scipy.special.binom(n - 1, k) % 2) * r[s[n - k - 1]]
r.append(result)
def binomial_transform(sequence):
n = len(sequence)
result = [0] * n
for i in range(n):
for j in range(i+1):
result[i] += sequence[j] * scipy.special.binom(i, j)
return result
sequence = r
binomial_result = binomial_transform(sequence)
print(binomial_result)
我试着从结果开始的地方开始,0而不是1,尝试用1作为元素初始化r而不是它是空的,尝试maybe而不是范围n-1中的k,范围n中的k。当列表s是oeis序列A000120时,代码工作得很好,它产生了,正如预期的那样,oeis A101911。现在,我把它从A000120改为A001511,它说列表索引超出范围。我都快疯了。如果我只是在s的前面加上另一个数字,它编译时没有错误,但是如果删除一个元素,就会有错误。
1条答案
按热度按时间yyhrrdl81#
这个答案只是使几个评论的观察更加明确。
标记的重复项不是特别有用,因为它关注的是索引一个n项长的列表的
nth
时间的常见情况。这里的问题是使用一个中间索引数组,它可能具有太大的值。当我运行你的部分代码时,我得到:
并且
ipython
显示器突出显示r[s[n - k - 1]]
表达式。让我们再试一次打印:
所以经过几次循环,
n=2
,r
有两项。n-k-1
是2-0-1=1。s[1]
是2
。r[2]
引发错误。我不知道你为什么选择s
的元素作为r
的索引。r
开始为空,并随着每次追加而增长。但是s
的值与r
的大小没有任何明显的联系。它们的范围从1到7,似乎是随机的。像
r[s[n - k - 1]-1]
这样的调整解决了这个n
的问题,但是以后的s
呢?尝试一下,它确实运行到n=19,结果是
r
:同样,这取决于
s
的值。通过添加-1
,r
索引范围从[0,6]
开始。因此,如果6
在循环中不是太早,它就会运行。但是在不了解s
的情况下,这个补丁看起来就像是一个组装件。