我将重新使用数学,算法和数据结构。今天,我花时间研究欧几里得算法和最大公约数。
下面,我实现了一个函数来演示我学到的东西:
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
今天晚些时候,所以也许我只需要喝杯茶来唤醒自己。但是我似乎无法确定为什么变量gcd
是None
而不是a
的整数值的原因。我想念什么?
谢谢。
答案 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
语句,我想它们都不适用。