- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力理解基于鸡蛋掉落问题的以下代码行。特别是,我无法理解 memo_cyclic
函数。您能向我解释一下 *args
的作用吗,以及 decorator
在此设置中的工作原理吗? f_memo.__name__ = f.__name__
有什么作用?为什么当我删除上面的行并包括 @memo_cyclic
时,程序会返回错误?
def memo_cyclic(f_cycle):
def decorator(f):
cache = {}
def f_memo(*args):
args = tuple(args)
if args not in cache:
cache[args] = f_cycle(*args)
cache[args] = f(*args)
return cache[args]
f_memo.__name__ = f.__name__
return f_memo
return decorator
fail = float("infinity")
@memo_cyclic(lambda *args: fail)
def f(n, lo, hi, fl=0, dr=0):
if lo == hi:
return 0 # only one floor is possible
if n+dr == 0:
return fail # out of eggs
if fl == 0:
n, dr = n+dr, 0 # pick up any dropped eggs
return 1 + min(f(n, lo, hi, fl-1, dr) if fl > 0 else fail, # go down one floor
f(n, lo, hi, fl+1, dr) if fl < hi else fail, # go up one floor
max(f(n-1, lo, fl, fl, dr), # drop egg (broken)
f(n-1, fl+1, hi, fl, dr+1)) # drop egg (unbroken)
if n > 0 and lo <= fl < hi else fail)
import sys
sys.setrecursionlimit(10000)
print [f(n, 0, n) for n in range(20)]
print [f(1, 0, n) for n in range(20)]
print f(2, 0, 99)
最佳答案
这在任何关于装饰器的优秀教程中都有解释。例如https://realpython.com/primer-on-python-decorators/ .
但这是基本流程。考虑这个构造。
@decorator
def some_function (...):
...
实际上是以下内容的简写:
def some_function (...):
...
some_function = decorator(some_function)
但是在您的情况下,您有一个带参数的装饰器。那有什么作用?嗯:
@complex_decorator(stuff)
def some_function (...):
...
简单的意思
def some_function (...):
...
some_function = complex_decorator(stuff)(some_function)
所以complex_decorator
需要是一个返回函数的函数。它返回的函数需要接受一个函数并返回一个新函数! (是的,这应该会让你在头几次遇到它时头晕目眩。但这都是合乎逻辑的。)
现在你的复杂装饰器是memo_cyclic
,它太聪明了一半。让我们看看是否可以通过评论和数字来解决它。请尝试按数字顺序阅读评论。它们通常从外到内,因此在尝试阅读函数内部之前请跳过函数下方。
# 1) This is a recursive cache that will avoid repeated work and
# also replace infinite cycles with a failure value that is
# f_cycle(whatever, the, arguments, were)
def memo_cyclic(f_cycle):
# 3) decorator will take our original function, and returns the
# replacement. By possibly confusing coincidence, the
# function was originally called f before (global namespace)
# and is locally called f here in scope. But it would work
# just fine if we locally called it g.
def decorator(f):
# 5) cache will have the values that we have produced
# before so that we can return them instead of
# having to calculate them a second time. This trick
# is called "memoizing"
cache = {}
# 6) f_memo will be our replacement for f. Note that *args
# here just means, "Turn whatever list of arguments we got
# before into an array."
def f_memo(*args):
# 9) A tuple is the same as an array except that it can't
# change. Because it can't change, Python will let us
# use it as the key to a dictionary.
args = tuple(args)
# 10) And now we check if the tuple is in the cache. If
# we have received this set of arguments before, the
# cache will be filled and we skip this. Else we have
# work to do.
if args not in cache:
# 11) We set the value to return upon hitting an
# infinite loop. Note that *args here means
# "turn a list back into a list of arguments
# before calling the function".
cache[args] = f_cycle(*args)
# 12) And now we recursively do the original
# calculation. Note that when f calls itself
# recursively, it will call what is bound to
# the name f. Which will _actually_ be the
# function f_memo. Which means that if it
# WOULD have gone into an infinite loop, it
# will INSTEAD return the failure value. (In
# our case, infinity.)
cache[args] = f(*args)
# 13) And whether we just calculated it, or had it
# from before, the answer should be cache[args].
return cache[args]
# 7) As a nicety, we make f_memo report itself as whatever
# name f had for itself. This will, for example, make
# stack backtraces look nicer.
f_memo.__name__ = f.__name__
# 8) Returning f_memo here with f_cycle and the old f
# bound to it tells Python to make it become the new f.
return f_memo
# 4) Returning decorator here with f_cycle already bound is what
# tells python to replace f with decorator(f).
return decorator
fail = float("infinity")
# 2) f_cycle will be a function that takes any arguments and
# returns infinity.
@memo_cyclic(lambda *args: fail)
def f (...)
...
关于python - 内存蛋花,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238893/
我在具有 2CPU 和 3.75GB 内存 (https://aws.amazon.com/ec2/instance-types/) 的 c3.large Amazon EC2 ubuntu 机器上运
我想通过用户空间中的mmap-ing并将地址发送到内核空间从用户空间写入VGA内存(视频内存,而不是缓冲区),我将使用pfn remap将这些mmap-ed地址映射到vga内存(我将通过 lspci
在 Mathematica 中,如果你想让一个函数记住它的值,它在语法上是很轻松的。例如,这是标准示例 - 斐波那契: fib[1] = 1 fib[2] = 1 fib[n_]:= fib[n] =
我读到动态内存是在运行时在堆上分配的,而静态内存是在编译时在堆栈上分配的,因为编译器知道在编译时必须分配多少内存。 考虑以下代码: int n; cin>>n; int a[n]; 如果仅在运行期间读
我是 Python 的新手,但我之前还不知道这一点。我在 for 循环中有一个基本程序,它从站点请求数据并将其保存到文本文件但是当我检查我的任务管理器时,我发现内存使用量只增加了?长时间运行时,这对我
我正在设计一组数学函数并在 CPU 和 GPU(使用 CUDA)版本中实现它们。 其中一些函数基于查找表。大多数表占用 4KB,其中一些占用更多。基于查找表的函数接受一个输入,选择查找表的一两个条目,
读入一个文件,内存被动态分配给一个字符串,文件内容将被放置在这里。这是在函数内部完成的,字符串作为 char **str 传递。 使用 gdb 我发现在行 **(str+i) = fgetc(aFil
我需要证实一个理论。我正在学习 JSP/Java。 在查看了一个现有的应用程序(我没有写)之后,我注意到一些我认为导致我们的性能问题的东西。或者至少是其中的一部分。 它是这样工作的: 1)用户打开搜索
n我想使用memoization缓存某些昂贵操作的结果,这样就不会一遍又一遍地计算它们。 两个memoise和 R.cache适合我的需要。但是,我发现缓存在调用之间并不可靠。 这是一个演示我看到的问
我目前正在分析一些 javascript shell 代码。这是该脚本中的一行: function having() { memory = memory; setTimeout("F0
我有一种情况,我想一次查询数据库,然后再将整个数据缓存在内存中。 我得到了内存中 Elasticsearch 的建议,我用谷歌搜索了它是什么,以及如何在自己的 spring boot 应用程序中实现它
我正在研究 Project Euler (http://projecteuler.net/problem=14) 的第 14 题。我正在尝试使用内存功能,以便将给定数字的序列长度保存为部分结果。我正在
所以,我一直在做 Java 内存/注意力游戏作业。我还没有达到我想要的程度,它只完成了一半,但我确实让 GUI 大部分工作了......直到我尝试向我的框架添加单选按钮。我认为问题可能是因为我将 JF
我一直在尝试使用 Flask-Cache 的 memoize 功能来仅返回 statusTS() 的缓存结果,除非在另一个请求中满足特定条件,然后删除缓存。 但它并没有被删除,并且 Jinja 模板仍
我对如何使用 & 运算符来减少内存感到非常困惑。 我可以回答下面的问题吗? clase C{ function B(&$a){ $this->a = &$a; $thi
在编写代码时,我遇到了一个有趣的问题。 我有一个 PersonPOJO,其 name 作为其 String 成员之一及其 getter 和 setter class PersonPOJO { priv
在此代码中 public class Base { int length, breadth, height; Base(int l, int b, int h) { l
Definition Structure padding is the process of aligning data members of the structure in accordance
在 JavaScript Ninja 的 secret 中,作者提出了以下方案,用于在没有闭包的情况下内存函数结果。他们通过利用函数是对象这一事实并在函数上定义一个属性来存储过去调用函数的结果来实现这
我正在尝试找出 map 消耗的 RAM 量。所以,我做了以下事情;- Map cr = crPair.collectAsMap(); // 200+ entries System.out.printl
我是一名优秀的程序员,十分优秀!