此函数 (lambda a: lambda z, c, n: a(a, z, c, n))
可以重写为
def apply_function_to_itself(funk):
def inner(arg1, arg2, arg3):
funk(funk, arg1, arg2, arg3)
return inner
这是一个函数式的东西,它以函数本身作为第一个参数来调用函数.这对于函数式语言中的递归是必要的,但在python中通常有更好的方法.
此函数(lambda s, z, c, n: z if n == 0 else s(s, z*z+c, c, n-1))
可以重写为:
def transform_n_times(funk, value, c, n):
if n==0:
return arg1
else:
return funk(funk, value * value + constant, constant, n-1)
我们从前面的函数中知道,funk === call_if_n_is_not_0
所以基本上结合起来,我们可以这样重写它:
def transform_n_times(value, constant, n):
for i in range(n):
value arg1 * arg1 + arg2
return value
简单得多.
Understanding the entire program
整个代码可以这样编写:
def apply_function_to_itself(funk):
def inner(arg1, arg2, arg3):
funk(funk, arg1, arg2, arg3)
return inner
def transform_n_times(funk, value, constant, n):
if n==0:
return arg1
else:
return funk(funk, value * value + constant, constant, n-1)
abs(apply_function_to_itself(call_if_n_is_not_0)(0, 0.02*x+0.05j*y, 10))
或者像这样.我们可以完全go 掉apply_function_to_itself
,但保持递归如下:
def transform_n_times(value, constant, n):
if n==0:
return arg1
else:
return transform_n_times(funk, value * value + constant, constant, n-1)
abs(transform_n_times(0, 0.02*x+0.05j*y, 10))
或者我们可以完全删除递归,只需使用循环:
constant = 0.02*x+0.05j*y
value = 0
n = 10
for i in range(n):
a1 = value * value + constant
abs(value)
mandlebrot集合背后的基本方程是f(x) = x^2+c
,这与此相匹配.