没有外部库的简单多项式微分器
Simple Polynomial Differentiator without external libraries
我正在尝试在不使用 sympy 和 numpy 等外部库的情况下制作多项式微分器,这些是测试用例:
"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"
然而,当它应该工作时,我在第 4 行收到列表索引错误。
s=input().split(' + ')
y='x'in s[0]
L=map(lambda x:map(int,x.split('x^')),s[2-y:])
print(' + '.join([s[1-y][:-1]]+['x^'.join(map(str,[a*b,b-1])).rstrip('^1')for a,b in L]))
当你的代码如此紧凑地排在一行时,很难阅读。您是否希望它如此紧凑且难以阅读(您是否参加编码竞赛?)。我建议将您的代码稍微展开一些,然后您就可以轻松地看到要做什么(其他人也可以)。
看起来您的代码没有很好地处理常量和线性情况。我们还应该指出,如果我有一个系数列表,那么导数真的很容易。也许一些功能,如:
def list_to_poly(coef_list):
poly_list = []
if not coef_list or coef_list==[0]:
poly_list.append('0')
if len(coef_list)>=1 and coef_list[0]:
poly_list.append(f'{coef_list[0]}')
if len(coef_list)>=2 and coef_list[1]:
poly_list.append(f'{coef_list[1] if coef_list[1]!=1 else ""}x')
poly_list.extend([f'{i if i!=1 else ""}x^{j+2}' for j,i in enumerate(coef_list[2:]) if i])
return ' + '.join(poly_list)
def poly_to_list(string):
terms = string.split(' + ')
poly_list = []
for term in terms:
if 'x^' not in term:
if 'x' not in term:
poly_list.append(int(term))
else:
linear_coef = term.split('x')[0]
poly_list.append(int(linear_coef) if linear_coef else 1)
else:
coef,exp = term.split('x^')
for i in range(len(poly_list),int(exp)):
poly_list.append(0)
poly_list.append(int(coef) if coef else 1)
return poly_list
def derivative(string):
poly_list = poly_to_list(string)
derivative = [i*j for i,j in enumerate(poly_list)][1:]
d_string = list_to_poly(derivative)
return d_string
print(derivative('0'))
print(derivative('3 + 5x'))
print(derivative('3 + x^5 + -3x^7'))
我正在尝试在不使用 sympy 和 numpy 等外部库的情况下制作多项式微分器,这些是测试用例:
"3 + 1x + 2x^2" ==> "1 + 4x"
"1 + 2x + -3x^2 + 17x^17 + -1x^107" ==> "2 + -6x + 289x^16 + -107x^106"
"17x + 1x^2" ==> "17 + 2x"
然而,当它应该工作时,我在第 4 行收到列表索引错误。
s=input().split(' + ')
y='x'in s[0]
L=map(lambda x:map(int,x.split('x^')),s[2-y:])
print(' + '.join([s[1-y][:-1]]+['x^'.join(map(str,[a*b,b-1])).rstrip('^1')for a,b in L]))
当你的代码如此紧凑地排在一行时,很难阅读。您是否希望它如此紧凑且难以阅读(您是否参加编码竞赛?)。我建议将您的代码稍微展开一些,然后您就可以轻松地看到要做什么(其他人也可以)。
看起来您的代码没有很好地处理常量和线性情况。我们还应该指出,如果我有一个系数列表,那么导数真的很容易。也许一些功能,如:
def list_to_poly(coef_list):
poly_list = []
if not coef_list or coef_list==[0]:
poly_list.append('0')
if len(coef_list)>=1 and coef_list[0]:
poly_list.append(f'{coef_list[0]}')
if len(coef_list)>=2 and coef_list[1]:
poly_list.append(f'{coef_list[1] if coef_list[1]!=1 else ""}x')
poly_list.extend([f'{i if i!=1 else ""}x^{j+2}' for j,i in enumerate(coef_list[2:]) if i])
return ' + '.join(poly_list)
def poly_to_list(string):
terms = string.split(' + ')
poly_list = []
for term in terms:
if 'x^' not in term:
if 'x' not in term:
poly_list.append(int(term))
else:
linear_coef = term.split('x')[0]
poly_list.append(int(linear_coef) if linear_coef else 1)
else:
coef,exp = term.split('x^')
for i in range(len(poly_list),int(exp)):
poly_list.append(0)
poly_list.append(int(coef) if coef else 1)
return poly_list
def derivative(string):
poly_list = poly_to_list(string)
derivative = [i*j for i,j in enumerate(poly_list)][1:]
d_string = list_to_poly(derivative)
return d_string
print(derivative('0'))
print(derivative('3 + 5x'))
print(derivative('3 + x^5 + -3x^7'))