1

假设我有一个名为my_func(a,b,s,t). 假设,我想ab被值传递,但我想st被引用传递。如在,我想一些如何通过让我们说(4,5,s',t')。该函数通过调用 来执行计算my_func(a/2,b/2,s/2,t/2)。问题是,在递归的“底部”有一个基本案例,它为sand提供了具体的值t

让我举一个小例子:

def e_euclid(a,b,s,t):
    
if (a == b):
    s = 4
    t = -3
    return a


if (a%2 == 0 and b%2 == 0):
    
    if (s%2 == 0 and t%2 == 0):
        return 2*e_euclid(a/2,b/2,s/2,t/2)
    else:
        return 2*e_euclid(a/2,b/2,(s+b)/2,(t-a)/2)
...

因此,我将此函数称为 ,e_euclid(a,b, something, something)但随后我必须为s和提供具体值t。你们能看到我在这里想做什么吗?

在我返回 (s,t) 的地方进行递归会导致我不希望执行的艰难计算,所以我想这样做。

4

1 回答 1

0

您的代码似乎已损坏,已经使用a == bands = 4和 and的基本情况 (?)t = -3没有意义。但是请参阅这个 C++ 实现和我使用单元素列表而不是 C++ 的引用的 Python 翻译:

def gcd(a, b, x=[None], y=[None]):
    if b == 0:
        x[0] = 1
        y[0] = 0
        return a
    x1, y1 = [None], [None]
    d = gcd(b, a % b, x1, y1)
    x[0] = y1[0]
    y[0] = x1[0] - y1[0] * (a // b)
    return d

a, b = 123, 321
x, y = [None], [None]
print(gcd(a, b, x, y), x, y, a*x[0] + b*y[0])

输出(在线尝试!):

3 [47] [-18] 3

我认为您正在尝试使用该算法的二进制版本,这应该是可行的。

于 2021-09-19T20:05:50.793 回答