【问题标题】:Composite functions in python - dual composepython中的复合函数-双重组合
【发布时间】:2019-08-17 13:44:04
【问题描述】:

我遇到了以下作业问题:

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

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

【问题讨论】:

  • 你知道用来给你的问题打分的测试用例吗?我找不到任何两个功能不同的情况。
  • 那些不是很好的测试函数,因为加法是可交换的——如果你以错误的顺序调用它们,你不会注意到它们的区别。但是我尝试混合加法和乘法,我也找不到区别。
  • 由于不断的模运算,它可能比建议的解决方案慢得多。交换会更快。
  • @Sebastian 不幸的是,我没有测试用例:(
  • @Barmar 感谢您让我知道在此类函数中使用交换运算符,将来处理类似问题时会记住它们。

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


【解决方案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 + 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))

【讨论】:

  • 太好了,从来不知道我可以这么简单。感谢您的解释! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
相关资源
最近更新 更多