Замена функции высшего порядка на рекурсию + 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
→ Ссылка