繁体   English   中英

我不明白的关于 python 的应用问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM