二项式的高阶函数

时间:2014-04-13 15:30:36

标签: python

假设我得到了这个

 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

的HOF
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 

2 个答案:

答案 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和更高阶函数更常见。

此外,您应该避免重用名称sumnext,它们都属于Python中的内置函数。如果你将这些名字用于别的东西,你会倾向于混淆那些阅读代码的人(可能包括你自己在未来)。