Как вернуть значение из функции более высокого порядка? - PullRequest
0 голосов
/ 01 мая 2020

ребята, как мне сделать так, чтобы вызов make_repeater (square, 0) (5) возвращал 5 вместо 25? Я предполагаю, что мне нужно изменить строку "function_successor = h", потому что тогда я просто получаю квадрат (5), но не уверен, что мне нужно изменить его на ...

square = lambda x: x * x

def compose1(h, g):
    """Return a function f, such that f(x) = h(g(x))."""
    def f(x):
        return h(g(x))
    return f

def make_repeater(h, n):
    iterations = 1
    function_successor = h
    while iterations < n:  
        function_successor = compose1(h, function_successor)
        iterations += 1
    return function_successor

это должен удовлетворять ряду других требований, таких как:

make_repeater (квадрат, 2) (5) = квадрат (квадрат (5)) = 625

make_repeater (квадрат, 4) (5) = квадрат (квадрат (квадрат (квадрат) (5)))) = 152587890625

1 Ответ

0 голосов
/ 02 мая 2020

Для этого необходимо использовать функцию идентификации (f(x) = x) в качестве начального значения для function_successor:

def compose1(h, g):
    """Return a function f, such that f(x) = h(g(x))."""
    def f(x):
        return h(g(x))
    return f


IDENTITY_FUNCTION = lambda x: x

def make_repeater(function, n):
    function_successor = IDENTITY_FUNCTION

    # simplified loop
    for i in range(n):
        function_successor = compose1(function, function_successor)

    return function_successor


if __name__ == "__main__":    
    square = lambda x: x * x
    print(make_repeater(square, 0)(5))
    print(make_repeater(square, 2)(5))
    print(make_repeater(square, 4)(5))

, а на выходе будет

5
625
152587890625

Однако это не совсем оптимально для производительности, поскольку функция идентификации (которая не делает ничего полезного) всегда является частью составной функции, поэтому оптимизированная версия будет выглядеть так:

def make_repeater(function, n):
    if n <= 0:
        return IDENTITY_FUNCTION

    function_successor = function
    for i in range(n - 1):
        function_successor = compose1(function, function_successor)

    return function_successor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...