欧几里得GCD函数返回类型None而不是int

时间:2019-11-27 22:23:05

标签: python python-3.x algorithm math

我将重新使用数学,算法和数据结构。今天,我花时间研究欧几里得算法和最大公约数。

下面,我实现了一个函数来演示我学到的东西:

from math import floor

def euclidian(a: int, b: int):
    # a = b * q + r
    _q: int = int(floor(a / b))
    print(f"Quotient: {_q}")
    r: int = a % b
    print(f"Remainder: {r}")
    a = b
    print(f"A = B({a})")
    b = r
    print(f"B = R({b})")

    if a != 0 and b != 0:
        euclidian(a, b)

    # a = 0; gcd(0, b) = b
    elif a == 0:
        print(f"Returning value a({b}) | type: {type(b)}")
        return b

    # b = 0; gcd(a, 0) = a 
    elif b == 0:
        print(f"Returning value a({a}) | type: {type(a)}")
        return a

a: int = 270
b: int = 192
gcd: int = euclidian(a, b)
print(f"GCD type: {type(gcd)}")
print(f"GCD({a}, {b}) = {gcd}")

此递归函数经过几次迭代,最终返回了以下结果:

Quotient: 6
Remainder: 0
A = B(6)
B = R(0)
Returning value a(6) | type: <class 'int'>

GCD type: <class 'NoneType'>
GCD(270, 192) = None

今天晚些时候,所以也许我只需要喝杯茶来唤醒自己。但是我似乎无法确定为什么变量gcdNone而不是a的整数值的原因。我想念什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

您正在进行递归调用,但未返回该值。即

if a != 0 and b != 0:
    euclidian(a, b)

应该是

if a != 0 and b != 0:
    return euclidian(a, b)

您也没有其他人所说的基本情况。

答案 1 :(得分:0)

当一个函数返回None时,通常意味着它在代码末尾运行而没有命中return语句。在您的情况下,您有一堆if语句,我想它们都不适用。