[英]application question about python that i don't understand
对于我在 IT 学校的申请,我必须准备一个关于 python 的问题。
这是问题:
考虑的 Python 解释器是 CPython(“标准”解释器),版本 >= 3.5
def f(n:int)->int:
if (n < 0):
raise Exception("n cannot be negative but it's \{\}".format(n))
elif (n == 0):
return 0
elif (n == 1 or n == 2):
return 1
else:
return (f(n-1) + f(n-2))
分支 elif(n == 1 or n == 2) 中的测试 n == 2 是?
请选择以下答案之一 请仅选择以下选项之一:
- 算法无用,但实现优化
-完全没用
- 绝对强制
我知道 f(n) 必须调用 function 调用 f 没问题,我的理解是,如果 function 不能与 n==2 一起使用,那么必须避免错误,但如果它工作得很好,那么它就是优化(idk 它可以避免循环使代码运行得更快)
我应该怎么知道?
您可以通过思考 function 在您的脑海中做了什么来解决这个问题。
使用elif (n == 1 or n == 2):
, f(n=2)
的计算结果为1
。 让我们将此作为我们的预期结果。 现在让我们看看 function 在没有elif (n == 1 or n == 2):
和elif (n == 1):
的情况下会做什么。
控制流将在以下行结束(因为没有到达前面的 return 语句): return (f(n-1) + f(n-2))
。
使用n=2
,计算结果为:
f(1) + f(0)
这反过来评估为1
,这是预期的结果。 因此,检查elif (n == 1 or n == 2):
不是绝对强制性的,因为没有它,预期结果是相同的。
然而,由于 Python 不需要对 function 进行三次评估(f(2) 一次,最后一行中的 f(1) 和 f(0) 一次),因此可以将其描述为性能优化。
是否是实现优化是另一回事。 我会说不,因为在递归 function 中,你真的只想要递归本身和退出条件。
这是性能优势:
def f(n:int)->int:
if (n < 0):
raise Exception("n cannot be negative but it's \{\}".format(n))
elif (n == 0):
return 0
elif (n == 1 or n == 2):
return 1
else:
return (f(n-1) + f(n-2))
%timeit f(2) # 151 ns ± 5.62 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)
def f_opt(n:int)->int:
if (n < 0):
raise Exception("n cannot be negative but it's \{\}".format(n))
elif (n == 0):
return 0
elif (n == 1):
return 1
else:
return (f(n-1) + f(n-2))
%timeit f_opt(2) # 389 ns ± 48.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.