假设我得到了这个
def sum(term, a, next, b):
if (a>b):
return 0
else:
return term(a) + sum(term, next(a), next, b)
和
def poly_while(coefficients, x):
i, result = 0, 0
while i < len(coefficients):
result += coefficients[i] * (x ** i)
i = i + 1
return result
我想写一个使用sum
def poly(coefficients, x):
return sum(lambda a: coefficients[a]*(x**(a)),0, lambda x: x + 1, len(coefficients))
这里的错误是什么?
以下是输入
poly((1, 2, 3, 4, 5), 3) #1(3^0) + 2(3^1) +3(3^2) +4(3^3) + 5(3^4) = 547
poly((1, 2, 3, 4, 5), 1) #15
poly((), 3) #0
答案 0 :(得分:0)
以下方法按预期工作:
def poly(coefficients, x):
return sum([i*(x**(i-1)) for i in coefficients])
>>> print poly((1, 2, 3, 4, 5), 3)
>>> print poly((1, 2, 3, 4, 5), 1)
>>> print poly((), 3)
547
15
0
答案 1 :(得分:0)
您使用poly
版本时遇到的错误与绑定检查有关。 sum
仅在a > b
时停止递归,但您为b
提供的值为len(coefficients)
。这导致代码尝试访问coefficients[len(coefficients)]
,这会产生IndexError。
您需要将>
中的sum
更改为>=
,或将b
传递的poly
值更改为len(coefficients) - 1
。
最后一点:这种编码风格并不是非常恐怖的。使用迭代和生成器表达式或列表推导比使用lambda
和更高阶函数更常见。
此外,您应该避免重用名称sum
和next
,它们都属于Python中的内置函数。如果你将这些名字用于别的东西,你会倾向于混淆那些阅读代码的人(可能包括你自己在未来)。