我遇到了以下作业问题:
我针对此问题的代码被标记为错误,当我查看建议的解决方案时,我不明白我哪里出错了。我在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
>>>
如果有人能在我的解决方案中发现错误,我将不胜感激。谢谢。
答案 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)
。因此,f
和g
每次都会改变位置,因为n
递减到基础情况0
,返回身份(无操作)功能。
可读性较差的版本,但工作原理相同-
def dual (f, g, n):
return lambda x: \
x if n == 0 else f(dual(g, f, n - 1)(x))