为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2021-12-17 15:38:13
我遇到了以下作业问题:我的这个问题的代码被标记为错误,当我查看建议的解决方案时,我无法理解我哪里出错了。我在 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 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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


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)。因此f,g每次更改位置作为n递减到0,基本情况,返回身份(无操作)函数。


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


def dual (f, g, n):

  return lambda x: \

    x if n == 0 else f(dual(g, f, n - 1)(x))


查看完整回答
反对 回复 2021-12-17
  • 1 回答
  • 0 关注
  • 333 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信