由于 GCD 是结合律,GCD(a,b,c,d)
是相同的GCD(GCD(GCD(a,b),c),d)
。在这种情况下,Python 的reduce函数将是减少以下情况的良好候选者:len(numbers) > 2
到简单的 2 数比较。代码看起来像这样:
if len(numbers) > 2:
return reduce(lambda x,y: GCD([x,y]), numbers)
Reduce 将给定的函数应用于列表中的每个元素,这样就像
gcd = reduce(lambda x,y:GCD([x,y]),[a,b,c,d])
和做一样
gcd = GCD(a,b)
gcd = GCD(gcd,c)
gcd = GCD(gcd,d)
现在唯一剩下的就是编写代码len(numbers) <= 2
。仅传递两个参数GCD
in reduce
确保你的函数最多递归一次(因为len(numbers) > 2
仅在原始调用中),这具有永远不会溢出堆栈的额外好处。