Повторное применение функции - PullRequest
5 голосов
/ 26 мая 2011

У меня возникла проблема с вопросом, который следующим образом: Пишите рекурсивную функцию несколько разApply, которая принимает в качестве аргументов функцию f с одним аргументом и положительное целое число n.Результат repeatApply является функцией одного аргумента, который применяет f к этому аргументу n раз.

Так, например, у нас будет

repeatedlyApply(lambda x: x+1,10)(100) ==> 110

Вы можете предположить, что определена следующая функция.Вам не нужно его использовать, но это может способствовать хорошему решению.

def compose(f,g):
    return lambda x: f(g(x))

Пока я написал это

def compose(f,g):
    return lambda x: f(g(x))

def recApply(f,n):
    for i in range(n):
        return recApply(compose(f,f), n-1)
    return f

Я где-то ошибаюсь, потому что с помощью приведенного выше примера recApply (lambda x: x + 1,10)(100) Я получаю 1124.

Помощь очень ценится

Ответы [ 4 ]

4 голосов
/ 26 мая 2011

Правильный ответ:

def recApply(func, n):
    if n > 1:
        rec_func = recApply(func, n - 1)
        return lambda x: func(rec_func(x))
    return func

И вывод:

>>>> print recApply(lambda x: x+1,10)(100)
110
2 голосов
/ 26 мая 2011

Ваша функция нуждается в некоторой работе:

  • У вас есть return внутри цикла for, поэтому вы сразу же возвращаетесь вместо запуска цикла.
  • У вас естьрекурсивный вызов внутри цикла for, поэтому вы выполняете слишком много итераций.Выберите один или другой.
  • Будьте осторожны, когда вы ставите композиции функций друг на друга, вы делаете композицию степеней, а не линейную композицию.

Можете ли вы сказать нам, что именноВы пытаетесь сделать?

РЕДАКТИРОВАТЬ: Поскольку все остальные публикуют ответ:

recApply = lambda f, n: lambda x: x if n == 0 else recApply(f, n-1)(f(x))
2 голосов
/ 26 мая 2011

У меня есть решение, основанное на лямбдах:

>>> f = lambda x: x + 10
>>> iterate = lambda f, n, x : reduce(lambda x, y: f(x), range(n), x)
>>> iterate(f, 10, 3)
103
>>> iterate(f, 4, 4)
44
>>> f10 = lambda x: iterate(f, 10, x)
>>> f10(5)
105
0 голосов
/ 26 мая 2011

Полагаю, это какое-то упражнение. Есть несколько способов сделать это, вот короткий:

>>> repeatedlyApply = lambda f, n: reduce(lambda f1, f2: compose(f1, f2), [f]*n)
>>> repeatedlyApply(lambda x: x+1,10)(100)
110
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...