python中的复合函数-双重组合

我遇到了以下作业问题:

http://img3.mukewang.com/61bc3e8b0001942c18350729.jpg

我的这个问题的代码被标记为错误,当我查看建议的解决方案时,我无法理解我哪里出错了。我在 Python IDLE 编译器中运行这两个函数的代码只是为了看到两个函数返回相同的输出,如下所示:


>>> def dual_function(f,g,n): #Suggested solution

    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


>>> def dual_function_two(f,g,n): #My solution

    def helper(x):

        if n%2==0:

            for i in range (n):

                if i%2==0:

                    x = g(x)

                else:

                    x = f(x)

        else:

            for i in range(n):

                if i%2==0:

                    x = f(x)

                else:

                    x = g(x)

        return x

    return helper


>>> add1 = lambda x: x+1

>>> add2 = lambda x: x+2

>>> dual_function(add1,add2,4)(3)

9

>>> dual_function_two(add1,add2,4)(3)

9

>>> 

如果有人能找出我的解决方案中的错误,我将不胜感激。谢谢你。


叮当猫咪
浏览 334回答 1
1回答

凤凰求蛊

建议的解决方案是不必要的复杂。无数的变量重新分配和循环是一个令人头疼的问题。这是一个简化的替代方案 -def dual (f, g, n):  if n == 0:    return lambda x: x  else:    return lambda x: f(dual(g, f, n - 1)(x))add1 = lambda x: 1 + xadd2 = lambda x: 2 + xprint(dual(add1,add2,4)(3))# 9# (1 + 2 + 1 + 2 + 3)print(dual(add1,add2,9)(3))# 16# (1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 3)print(dual(add1,add2,0)(3))# 3这样做的原因是因为在递归分支中,我们dual使用交换的参数调用dual(g,f,n-1)。因此f,g每次更改位置作为n递减到0,基本情况,返回身份(无操作)函数。可读性稍差的版本,但工作原理相同 -def dual (f, g, n):  return lambda x: \    x if n == 0 else f(dual(g, f, n - 1)(x))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python