Рекурсивная двойная функция Python против итеративной функции

#python

#python

Вопрос:

В принципе, я не уверен, что не так с моим ответом по сравнению с ответом модели. Чего я пытаюсь достичь здесь, так это создать функцию, которая может выполнять lambda x: f(g(f(g(f(g(f(x))))))) # for n == 7 или lambda x: f(g(f(g(x)))) # for n == 4

Что я пробовал

 def dual_function(f, g, n):
    if n == 1:
        return f
    elif n % 2 == 0:
        return lambda x: dual_function(f,g, n-1)(g(x))
    else:
        return lambda x: dual_function(f,g, n-1)(f(x))
# the code seems to do the above from my understanding?
# it starts off at n == 7: new_x = f(x)
# n == 6: new_x = g(new_x)
# n == 5: new_x = f(new_x) 
# and so continues down...
  

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

     def dual_function(f,g,n):
    def helper(x):
        f1,g1 = f,g
        if n%2==0:
            f1,g1 = g1,f1
        for i in range(n):
            x = f1(x)
            f1,g1= g1,f1
        return x
    return helper
  

Примерный пример

 f = lambda x: x 1
g = lambda x: x/2
print(dual_function(f, g, 7)(1)) 
# correct answer is 0.9375, versus my wrong answer: 2.0
  

Комментарии:

1. Для чего нужен диапазон n ?

2. вероятно, что-то вокруг sys.getrecursionlimit() , которое по умолчанию равно 1000

3. Ваш код выдает 2 и f(g(f(g(f(g(f(1))))))) = 2 . Итак, код соответствует описанию. Я думаю, вы и the model просто решаете немного разные проблемы.

Ответ №1:

Ваш код и код модели, похоже, решают разные проблемы. Ваш код всегда начинается с f(...) как самого внешнего вызова (а самый внутренний вызов может варьироваться в зависимости от того, является n четным или нечетным), в то время как ссылочный код всегда имеет g(x) в качестве самого внутреннего вызова (а самый внешний вызов может варьироваться).

Итак, причина, по которой ваша функция не подходит для n=7 , заключается в том, что вы вычисляете, f(g(f(g(f(g(f(x))))))) в то время как другая функция выполняет g(f(g(f(g(f(g(x))))))) . К сожалению, я не могу сказать вам, какую из них вы на самом деле должны вычислять.

Комментарии:

1. Согласно вопросу, цель состоит в том, чтобы иметь f (x) в качестве самой внешней функции.

2. Замена блоков f (x) и g (x) на elif и else в ответе OP была бы правильной в соответствии с описанием вопроса.

3. @Abhijeetk431: Я не понимаю вашего второго комментария. Рекурсивный код спрашивающего делает именно то, что он пытается сделать, это модельное решение, которое делает что-то другое. В своем ответе я хотел поднять вопрос о том, что спрашивающий, возможно, неправильно понял свое домашнее задание. Также возможно, что модельное решение неверно, но у меня нет способа узнать.

4. Это рекурсивная функция, поэтому в коде OP f (x) является самым внутренним вызовом. Кажется, я допустил ошибку в своем втором комментарии, и вы допустили ошибку в своем ответе. 🙂 Я уже поддержал ваш ответ. Измените то единственное, что в коде операционной системы f (x) всегда является самым внутренним вызовом. Кроме того, пренебрегите моим вторым комментарием, поскольку это явно неправильно.

5. Нет, дважды проверьте, как работает код операционной системы. Она работает изнутри наружу, причем базовый вариант является самым внешним вызовом. Попробуйте сами, и вы увидите, что, вызывая их код с помощью n=4 , вы получаете f(g(f(g(x)))) не g(f(g(f(x)))) то, что, похоже, ожидаете.