今天数学课正好讲这个,于是整点花的(
使用牛顿迭代法求函数 f(x)=x^2-2
在 x=1.5
附近的零点,即 \sqrt 2
的值,精确到 10^{-12}
。
允许赋值表达式:
(lambda: (zero := lambda f, df, x, e: zero(f, df, x - fx / df(x), e) if abs(fx := f(x)) > e else x))()(lambda x: x * x - 2, lambda x: x * 2, 1.5, 1e-12)
写成纯 lambda:
(lambda f: (lambda f: f(f))(lambda g: f(lambda *v: g(g)(*v))))(lambda zero: lambda f, df, x, e: (lambda fx: zero(f, df, x - fx / df(x), e) if abs(fx) > e else x)(f(x)))(lambda x: x * x - 2, lambda x: x * 2, 1.5, 1e-12)
可以再闭个包:
(lambda f, df, e: (lambda f: (lambda f: f(f))(lambda g: f(lambda v: g(g)(v))))(lambda zero: lambda x: (lambda fx: zero(x - fx / df(x)) if abs(fx) > e else x)(f(x))))(lambda x: x * x - 2, lambda x: x * 2, 1e-12)(1.5)
或者少套一层:
(lambda f: lambda *v: f(f, *v))(lambda zero, f, df, x, e: (lambda fx: zero(zero, f, df, x - fx / df(x), e) if abs(fx) > e else x)(f(x)))(lambda x: x * x - 2, lambda x: x * 2, 1.5, 1e-12)
其实主要倒不是牛顿迭代,而是递归的各种实现方式。
文章评论