我遇到了以下作业问题:我的这个问题的代码被标记为错误,当我查看建议的解决方案时,我无法理解我哪里出错了。我在 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 回答
![?](http://img1.sycdn.imooc.com/533e4c0500010c7602000200-100-100.jpg)
凤凰求蛊
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))
添加回答
举报
0/150
提交
取消