我想生成一个序列,以便先前生成的元素包含在下一个元素中,我不确定如何执行此操作。
即生成列表,使其项目为:
其中 x 只是一个 Sympy 符号
[x,(x)*(x+1),(x)*(x+1)*(x+2)]
而不是[x,x+1,x+2]
我在想类似的东西
k.append(k*(K+o))
但我不断收到类型错误
非常感谢任何帮助!
我想生成一个序列,以便先前生成的元素包含在下一个元素中,我不确定如何执行此操作。
即生成列表,使其项目为:
其中 x 只是一个 Sympy 符号
[x,(x)*(x+1),(x)*(x+1)*(x+2)]
而不是[x,x+1,x+2]
我在想类似的东西
k.append(k*(K+o))
但我不断收到类型错误
非常感谢任何帮助!
您可以使用sympy.RaisingFactorial
:
import sympy.RaisingFactorial as RF
from sympy.abc import x
length=3
ans = [RF(x,i) for i in xrange(1,length+1)]
这使:
[x, x*(x + 1), x*(x + 1)*(x + 2)]
RisingFactorial
可能是最好的方法,特别是如果你只想要最后一个学期,但你也可以这样做
a = [x]
for i in range(1, 5): # Replace 5 with however far up you want to go
a.append(a[-1]*(x - i))
也许使用递归lambda
函数和map
?
>>> fact = lambda x: x == 0 and 1 or x * fact(x - 1)
>>> map(fact, range(4))
[1, 1, 2, 6]
以及除此之外的许多其他方式。如果你想返回一个string
定义你的递归函数返回一个string
;
def fact(i):
if i == 0:
return 'x'
else:
return fact(i - 1) + '*(x+%d)' % i
接着
>>> map(fact, range(4))
['x', 'x*(x+1)', 'x*(x+1)*(x+2)', 'x*(x+1)*(x+2)*(x+3)']
如果您正在使用sympy
并认为使用字符串是“反模式”
import sympy
def fact(i):
if i == 0:
return sympy.Symbol('x')
else:
return sympy.Symbol('(x+%d)' % i) * fact(i - 1)
生产
>>> map(fact, range(4))
[x, (x+1)*x, (x+1)*(x+2)*x, (x+1)*(x+2)*(x+3)*x]
假设没有现成的函数,您可以Poly
很容易地通过它的根定义一个多项式表达式(不是 a )......
def poly_by_roots(roots, sym):
return prod(map(lambda x: sym-x, roots))
然后应用于根列表
polys = [poly_by_roots(range(a,1), x) for a in range(-5,1)]
这不是最有效的方法,即任何使用先前多项式仅相差 的事实的方法,(x+i)
例如
def poch_list(x,n):
if n==0:
return [x]
else:
val = poch_list(x,n-1)
return val + [val[-1]*(x+n)]
它允许符号长度,这可能是也可能不是一件好事。