我有一个函数f(x,y)
,其f(x,y) != f(y,x)
我想对任何n
概括如下:
n=1:C = A
n=2:C = f(A,B) + f(B,A)
n=3:C = f(A,f(B,B)) + f(B,f(A,B)) + f(B,f(B,A))
n=4:C = f(A,f(B,f(B,B)) + f(B,f(A,f(B,B)) + f(B,f(B,f(A,B)) + f(B,f(B,f(B,A))
模式是:
n
个术语李>n-1
对f()
的调用李>B
组成,除了每个位置有一个A
李>这是执行此操作的简单方法吗?这样我就可以编写一个函数,为任何n
计算C
(同时给出A
和B
)?i、 e.C = general(A, B, n)
重复组合二进制函数的结果通常被称为“折叠”或“减少”,它在Python中通过
functools.reduce
(或者在Python 2中仅reduce
)实现。有两种可能的折叠方向:左折叠,给定f
和[a, b, c, d, e]
将返回f(f(f(f(a, b), c), d), e)
,右折叠,将产生f(a, f(b, f(c, f(d, e))))
。默认情况下,functools.reduce
实现左折叠,但可以通过将参数交换到reduced函数并反转要缩减的列表来将其转换为右折叠为了解决您的问题,我们不需要颠倒列表。我们只需要按照正确的顺序生成它。事实上,我们并不真正需要一个列表,因为
reduce
在迭代器中可以很好地工作。例如,这个简单的迭代器:这样,我们可以生成您想要求和的各个术语:
因为这些是字符串,所以不能用
sum
求和,如果f
返回一个数字,就可以这样做。但您可以使用reduce
将它们与不同的二进制函数组合:如果您希望生成一个按照输出显示的字符串,这里有一个更简单的方法
下面是解决方案的解释
第1行:
y = [B* i + A + B* (n-(i+1)) for i in range(n)]
为n个位置创建一个'B'
字符串,同时用A
替换第i个位置第2行:
if len(y) == 1: return y[0]
如果输出只是一个值,则只返回该值第3行:
else: return ' + '.join('f('+'f('.join(list(i)[:-2] + [i[-2:]]) + ')'*(len(i)-1) for i in y)
如果输出是一组带a的b,则将它们作为f(
从列表中剥离每个字符,一次剥离一个字符,剩下最后两个字符。这些将合并为一个单独的集合。所有这些都将用)
关闭n-1次完整代码如下所示
其输出将为:
相关问题 更多 >
编程相关推荐