3

多項式 p(x) と値 x の係数 (a0、a1、a2、a3.....an) のリストを入力として受け取る関数を作成しようとしています。関数は 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 で機能しますが、インデックス エラーが発生します: リスト インデックスが 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

または、リストを使用してから使用することもできますsum

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

列挙なし:

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

非列挙方法の代替:

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

また、@DSM は次のように述べています。これを 1 行にまとめることができます。

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

または、次を使用しlambdaます。

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

再帰的な解決策:

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)はジェネレーター式です (そのyield代わりに使用returnし、数値と iterable の要素を生成します。数値は、要素のインデックス + start に相当します。

Python docs から、それは次と同じです:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
于 2013-06-04T21:10:20.760 に答える
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 に答える