【问题标题】:Why is recursion not ending with the correct value? [duplicate]为什么递归没有以正确的值结束? [复制]
【发布时间】:2021-01-12 06:26:26
【问题描述】:

我正在尝试编写代码来递归计算两个数字(n 和 m)的 GCD。随着递归的进行,我希望我的答案在 gcd_val 中更新。我尝试调试,但不明白为什么它选择较早的 gcd_val 与其子调用(内部递归调用)中获得的值相比。我想知道为什么会发生这种情况以及正确的方法应该是什么?当它应该是 4 时,我得到了答案 2。

def find_gcd(n, m, gcd_val):
factor_list = [2, 3, 5]
if n == 0 or m == 0:
    return 0
for f in factor_list:
    if n % f == 0 and m % f == 0:
        find_gcd(int(n/f), int(m/f), gcd_val)
        gcd_val *= f
return gcd_val

print(find_gcd(20, 8, 1))

【问题讨论】:

  • 我不知道这是什么语言,但您似乎没有对循环中递归调用返回的值做任何事情。我的意思是你在函数中调用find_gcd(int(n/f), int(m/f), gcd_val),但它的返回值不是你应用乘法赋值的值。您将乘法赋值 (*=) 应用于最初传递给函数的 gcd_val 参数。您需要将递归调用返回的值乘以赋值并从函数中返回。

标签: python python-3.x function recursion


【解决方案1】:

几乎所有编程语言都默认按值传递参数。那是函数启动的第二次,参数是该轮的唯一内存位置,并且使用它完成的所有更改都不会影响先前的调用,即使它是相同的名称。

编程语言不区分自调用或调用其他对象,因此当find_gcd 调用find_gcd 时,它会将其视为与调用find_gcd2 并具有类似实现一样。

就像您使用print 一样,您实际上需要使用返回值,否则find_gcd 中的递归调用是死代码。

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2023-03-23
    • 2018-10-19
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多