3

我正在尝试编写一个函数,该函数将多项式 p(x) 的系数列表 (a0, a1, a2, a3.....an) 和值 x 作为输入。该函数将返回 p(x),它是多项式在 x 处计算时的值。

系数为 a0, a1, a2, a3........an 的 n 次多项式是函数

p(x)= a0+a1*x+a2*x^2+a3*x^3+.....+an*x^n

所以我不确定如何解决这个问题。我在想我需要一个范围,但我怎样才能使它可以处理 x 的任何数字输入?我不指望你们给出答案,我只是需要一个小小的开始。我需要一个 for 循环、while 循环还是递归是一个选项?

def poly(lst, x)

我需要迭代列表中的项目,我是否为此使用索引,但是如何让它迭代未知数量的项目?

我想我可以在这里使用递归:

    def poly(lst, x):
        n = len(lst)
        If n==4:
           return lst[o]+lst[1]*x+lst[2]*x**2+lst[3]*x**3
        elif n==3:
           return lst[o]+lst[1]*x+lst[2]*x**2
        elif n==2:
           return lst[o]+lst[1]*x
        elif n==1:
           return lst[o]
        else:
            return lst[o]+lst[1]*x+lst[2]*x**2+lst[3]*x**3+lst[n]*x**n

这适用于 n<=4,但我得到一个索引错误:list index out of range for n>4,但不知道为什么。

4

5 回答 5

7

最有效的方法是使用霍纳法则反向评估多项式。在 Python 中很容易做到:

# Evaluate a polynomial in reverse order using Horner's Rule,
# for example: a3*x^3+a2*x^2+a1*x+a0 = ((a3*x+a2)x+a1)x+a0
def poly(lst, x):
    total = 0
    for a in reversed(lst):
        total = total*x+a
    return total
于 2015-12-06T07:18:06.870 回答
2
def evalPoly(lst, x):
    total = 0
    for power, coeff in enumerate(lst): # starts at 0 by default
        total += (x**power) * coeff
    return total

Alternatively, you can use a list and then use sum:

def evalPoly(lst, x):
        total = []
        for power, coeff in enumerate(lst):
            total.append((x**power) * coeff)
        return sum(total)

Without enumerate:

def evalPoly(lst, x):
    total, power = 0, 0
    for coeff in lst:
        total += (x**power) * coeff
        power += 1
    return total

Alternative to non-enumerate method:

def evalPoly(lst, x):
    total = 0
    for power in range(len(lst)):
        total += (x**power) * lst[power] # lst[power] is the coefficient
    return total

Also @DSM stated, you can put this together in a single line:

def evalPoly(lst, x):
    return sum((x**power) * coeff for power, coeff in enumerate(lst))

Or, using lambda:

evalPoly = lambda lst, x: sum((x**power) * coeff for power, coeff in enumerate(lst))

Recursive solution:

def evalPoly(lst, x, power = 0):
    if power == len(lst): return (x**power) * lst[power]
    return ((x**power) * lst[power]) + evalPoly(lst, x, power + 1)

enumerate(iterable, start) is a generator expression (so it uses yield instead of return that yields a number and then an element of the iterable. The number is equivalent to the index of the element + start.

From the Python docs, it is also the same as:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
于 2013-06-04T21:10:20.760 回答
2

简单的:

定义聚(lst,x):
  n, tmp = 0, 0
  对于一个 in lst:
    tmp = tmp + (a * (x**n))
    n += 1

  返回 tmp

打印 poly([1,2,3], 2)

简单递归:

def poly(lst, x, i = 0):
  尝试:
    tmp = lst.pop(0)
  除了索引错误:
    返回 0
  返回 tmp * (x ** (i)) + poly(lst, x, i+1)

打印 poly([1,2,3], 2)
于 2013-06-04T21:16:32.487 回答
1

使用递归或不使用递归,解决方案的本质是在“n”上创建一个循环,因为多项式从 x^0 开始并上升到 a_n.x^n,这也是您应该考虑作为输入的变量. 除此之外,使用称为乘法和累加的技巧能够计算每次循环迭代的部分结果。

于 2013-06-04T22:08:55.317 回答
0
def evalPoly(lst, x, power):
    if power == 0:
        return lst[power]
    return ((x**power) * lst[power]) + evalPoly(lst, x, power - 1)

lst = [7, 1, 2, 3]
x = 5
print(evalPoly(lst, x, 3))

计算公式为 - 3x^3 + 2x^2 + x + 7 当 x = 5 时,结果为 - 437

于 2020-10-15T16:37:35.053 回答