Como entrada, tengo una lista de números enteros no negativos que se supone que son los coeficientes de un polinomio. Pero también quiero evaluar el polinomio para un cierto número x.

Por ejemplo:

Si tenemos L=[2,3,1] como entrada y x=42 obtenemos 2x^2+3x+1=3655 Lo que quiero es, por ejemplo:

>>>p=polynomial([2,3,1])
>>>p(O)
1 
>>>p(42)
>>>3655

Supongo que tengo que utilizar la función lambda de alguna manera, y sé cómo funciona para dos variables en una función determinada, pero en este caso la función depende de mi entrada.

def polynomial(coef):
coef=coef[::-1]
for i in range(len(coef)):
    p=lambda x: coef[i]*x**i
    p+=p
return lambda x: p

Esto es, por supuesto, una tontería absoluta, ya que no puedo sumar una función lambda a otra, pero esto es lo que se acerca a mi "intuición".

Algunas sugerencias son muy apreciadas.

3
Tesla 11 ene. 2017 a las 13:52

4 respuestas

La mejor respuesta

Python simple:

def make_poly(coefs):
    def poly(x):
        result = 0
        for c in coefs:
            result = result * x + c
        return result
    return poly

p = make_poly([2,3,1])

print(p(0))
print(p(42))

EDITAR: código modificado según lo sugerido por Mark Dickinson en los comentarios

2
VPfB 11 ene. 2017 a las 12:13

La siguiente función lambda evalúa una función polinómica, ingresada como una lista de coeficientes coeff, en una x dada:

from functools import reduce

lambda coeff, x: reduce(lambda a, b: a*x + b, coeff)

Parece que desea generar estas funciones polinómicas. Todavía puedes hacerlo con este método:

def generate_polynomial(coeff):
    return lambda x: (lambda y: reduce(lambda a, b: a*y + b, coeff))(x)

>>> p = generate_polynomial([20,0,17])
>>> p(10)
2017

Esto se basa simplemente en Algoritmo de Horner.

Además, si desea utilizar exclusivamente lambda y no funciones incorporadas, también puede emular reduce con funciones lambda. Es posible que desee echar un vistazo a Python - Eliminando duplicados en la lista solo usando filtro y lambda y Eliminando duplicados usando solo funciones lambda, mostrando cómo obtener deshacerse de la función filter.

1
Community 23 may. 2017 a las 12:24

Puedes hacerlo usando lambda:

def polynomial(coef):
  n = len(coef) - 1
  return lambda x : sum([c * x ** (n - i) for (i, c) in enumerate(coef)])

Sin embargo, Lambda no es necesario, puede definir otra función dentro de la función polinómica de la siguiente manera:

def polynomial(coef):
  def f(x):
    n = len(coef) - 1
    return sum([c * x ** (n - i) for (i, c) in enumerate(coef)])
  return f

Editar: anteriormente la entrada estaba vinculada a 3 coeficientes

1
Max Wasylow 11 ene. 2017 a las 11:12

La solución pitónica más obvia (usando un cierre, con una lambda o (preferiblemente) una función interna con nombre) ya se ha publicado, pero para completar, agregaré la otra solución pitónica: la versión OO que usa una clase invocable personalizada :

class Polynomial(object):
    def __init__(self, coef):
        self.coef = coef

    def __call__(self, x):
        n = len(self.coef) - 1
        return sum(c * x ** (n - i) for (i, c) in enumerate(self.coef))

p = Polynomial([2,3,1])
print p(0)
print p(42)
4
bruno desthuilliers 11 ene. 2017 a las 11:38