python中的复合函数-Dual Compose

时间:2019-03-27 04:02:36

标签: python lambda functional-programming higher-order-functions

我遇到了以下作业问题:

enter image description here

我针对此问题的代码被标记为错误,当我查看建议的解决方案时,我不明白我哪里出错了。我在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
>>> 

如果有人能在我的解决方案中发现错误,我将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

建议的解决方案不必要地复杂。无数的变量重新分配和循环是令人头疼的秘诀。这是一个简化的替代方法-

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 + x
add2 = lambda x: 2 + x

print(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)。因此,fg每次都会改变位置,因为n递减到基础情况0,返回身份(无操作)功能。

可读性较差的版本,但工作原理相同-

def dual (f, g, n):
  return lambda x: \
    x if n == 0 else f(dual(g, f, n - 1)(x))