2014-04-13 48 views
0

假設海格爲了功能我給這個二項式

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)) 

什麼是錯這裏HOF?

這裏是輸入

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 
+1

請注意,'sum'和'next'都是Python中內置函數的名稱。雖然不禁止將名稱用於其他目的,但這樣做可能是一個糟糕的主意(您可能會迷惑自己或其他人)。 – Blckknght

回答

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 
+0

'sum'可以使用生成器表達式:'sum(i *(x **(i-1))for i in coefficients)' – iCodez

+0

您正在使用內置的sum而不是sum'提問者正在詢問。 – Blckknght

0

你與你的poly版本得到的錯誤已與邊界檢查的事。 sum只在a > b時停止遞歸,但您爲b提供的值爲len(coefficients)。這導致代碼嘗試訪問給出IndexError的coefficients[len(coefficients)]

您需要更改在sum>>=,或更改poly傳遞給len(coefficients) - 1b值。

最後一點:這種編碼方式並不是Pythonic。使用迭代和生成器表達式或列表解析比使用lambda和更高階函數更常見。

此外,您應該避免重複使用名稱sumnext,它們都屬於Python中的內置函數。如果您使用其他名稱的名稱,您會傾向於迷惑人們閱讀代碼(可能包括將來自己)。