Замена функции высшего порядка на рекурсию + lambda
Никак не могу понять как заменить функцию высшего порядка fn(f, n), используемую при вычислении sin (sin (sin (sin (sin (1))))) = 0,587181
from math import sin
def fn(f, n):
def fn_inside(x):
for i in range(n):
x = f(x)
return x
return fn_inside
f1 = fn(lambda x: "sin(%s)" % x, 5)
f2 = fn(lambda x: sin(x), 5)
print("%s = %f" % (f1("1"), f2(1)))
print(fn(lambda x: sin(x), 0)(1000))
на рекурсию + lambda
Обновление: Еще должно работать с выражением
print(fn(lambda x: sin(x), 0)(1000))
Ответ выглядит примерно так
def fn(f, n):
if n < 1:
return lambda y: y
elif n == 1:
return f
else:
return lambda y: fn(f, n-1)(f(y))
Ответы (2 шт):
Автор решения: GrAnd
→ Ссылка
Видимо как-то так:
from math import sin
def fn(f, n):
return f if n == 1 else lambda y: fn(f, n-1)(f(y))
f1 = fn(lambda x: sin(x), 5)
print(f1(1))
import sys
sys.setrecursionlimit(1500)
print(fn(lambda x: sin(x), 1000)(0))
Автор решения: Andy Pavlov
→ Ссылка
Если нужен рекурсивный синус, то можно все в одну lambda засунуть:
from math import sin
sin_rec = lambda x, n: x if n == 0 else sin(sin_rec(x, n - 1))
print(sin_rec(1, 5)) # 0.5871809965734309
Либо с подстановкой метода:
from math import sin
func = lambda fn, n: lambda x: fn(x) if n == 1 else fn(func(fn, n - 1)(x))
print(func(sin, 5)(1)) # 0.5871809965734309