【发布时间】:2021-09-19 19:29:08
【问题描述】:
假设我有一个名为my_func(a,b,s,t) 的函数。假设,我希望 a 和 b 按值传递,但我希望 s 和 t 按引用传递。如,我想知道如何传递让我们说(4,5,s',t')。该函数通过调用my_func(a/2,b/2,s/2,t/2) 来执行计算。问题是,在递归的“底部”有一个基本情况,它为s 和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) 的地方进行递归会导致我不想执行的艰难计算,所以我想这样做。
【问题讨论】:
-
通过值传递 6 个参数 - a、b、s 和 t,以及通过引用传递 s 和 t;将最后两个向下递归调用保持不变。或者,让函数返回
{a, s, t}的元组而不是单个值,那么您将不需要 by-ref 参数。或者,根本不使用递归:该示例涉及尾递归,它可以被迭代轻松替换。 -
所以,在递归停止之前,您不想指定第三个和第四个参数的值,然后您想知道第三个和第四个参数的值应该是什么从一开始就是对的。抱歉,没有现代通用编程语言可以这样工作。在表达式
if (s%2 == 0 and t%2 == 0)中,当这些值直到递归结束时才知道时,您如何期望知道s和t是什么? -
你应该迭代地重写它。将列表保留为堆栈,并将值与返回乘法一起压入其中。不会有递归和一个不错的
while not stack.is_empty() -
@SamVarshavchik 我不太了解他们的代码尝试,但请参阅我的答案以了解它是如何完成的。值
s和t(或x和y)确实只在递归的底部指定,这是微不足道的,因为它们对应的a和b已经变得微不足道了。在退出递归的过程中,我们确实计算了x和y“从一开始就应该正确”(即,对应于初始的a和b)。跨度>
标签: python c++ recursion euclidean-algorithm