- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我只是想学习一些 Lisp,所以我正在解决项目欧拉问题。我发现问题没有。 14 个有趣的问题(所以如果你打算解决这个问题,请停止阅读,因为我把我的解决方案粘贴在了底部)。使用我的算法它是如此缓慢,但在使用记忆化之后(我从 Paul Graham 的“on Lisp”书中复制了该函数)它快得多(大约 4 到 8 秒)。
我的问题是关于我收到的这一堆警告:难道我做错了什么?我可以改进我的风格吗?
> ;; Loading file
> /euler-lisp/euler-14.lisp
> ... WARNING in COLLATZ-SERIE :
> COLLATZ-SERIE-M is neither declared
> nor bound, it will be treated as if it
> were declared SPECIAL. WARNING in
> COLLATZ-SERIE : COLLATZ-SERIE-M is
> neither declared nor bound, it will be
> treated as if it were declared
> SPECIAL. WARNING in COMPILED-FORM-314
> : COLLATZ-SERIE-M is neither declared
> nor bound, it will be treated as if it
> were declared SPECIAL. (525 837799)
> Real time: 18.821894 sec. Run time:
> 18.029127 sec. Space: 219883968 Bytes GC: 35, GC time: 4.080254 sec. Las
> siguientes variables especiales no han
> sido definidas: COLLATZ-SERIE-M 0
> errores, 0 advertencias ;; Loaded file
这是代码:
(defun collatz (n)
(if (evenp n) (/ n 2) (+ (* 3 n) 1)))
(defun memoize (fn)
(let ((cache (make-hash-table :test #'equal)))
#'(lambda (&rest args)
(multiple-value-bind (val win) (gethash args cache)
(if win
val
(setf (gethash args cache)
(apply fn args)))))))
(defun collatz-serie (n)
(cond ((= n 1) (list 1))
((evenp n) (cons n (funcall collatz-serie-m (/ n 2))))
(t (cons n (funcall collatz-serie-m (+ (* 3 n) 1))))))
(defun collatz-serie-len (n)
(length (collatz-serie n)))
(setq collatz-serie-m (memoize #'collatz-serie))
(defun gen-series-pairs (n)
(loop for i from 1 to n collect
(list (collatz-serie-len i) i)))
(defun euler-14 (&key (n 1000000))
(car (sort (gen-series-pairs n) #'(lambda (x y) (> (car x) (car y))))))
(time (print (euler-14)))
非常感谢,请原谅可能出现的错误,我才刚刚开始使用 Lisp。
更新:我想分享我写的最终代码。使用自定义外部哈希表进行内存并改进最终循环。
(defvar *cache* (make-hash-table :test #'equal))
(defun collatz (n)
(if (evenp n) (/ n 2) (+ (* 3 n) 1)))
(defun collatz-serie (n)
(cond ((= n 1) (list 1))
((evenp n) (cons n (collatz-serie (/ n 2))))
(t (cons n (collatz-serie (+ (* 3 n) 1))))))
(defun collatz-serie-new (n)
(labels ((helper (n len)
(multiple-value-bind (val stored?) (gethash n *cache*)
(if stored?
val
(setf (gethash n *cache*) (cond ((= n 1) len)
((evenp n) (+ len (helper (/ n 2) len)))
(t (+ len (helper (+ (* 3 n) 1) len)))))))))
(helper n 1)))
;; learning how to loop
(defun euler-14 (&key (n 1000000))
(loop with max = 0 and pos = 0
for i from n downto 1
when (> (collatz-serie-new i) max)
do (setf max (collatz-serie-new i)) and do (setf pos i)
finally (return (list max pos))))
最佳答案
setq
一个未知的名字是不好的风格。假定您的意思是创建一个新的全局特殊变量,然后设置它,但这应该通过首先引入这些绑定(bind)来明确说明。您可以在顶层使用 defvar
(或 defparameter
或 defconstant
)代替,并在词法 block 中使用 let
、do
、multiple-value-bind
或类似结构。
关于Lisp风格问题: memoization (caution: contains the solution for project euler #14),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3516053/
我的构建菜单包含两个构建选项: 构建解决方案 构建MyProjectName 如果我选择Build Solution(然后是Debug,Start Debugging (F5)),运行的可执行文件不包
我有一个带有一些输入字段的表单。这些输入字段具有指定的背景渐变,如下所示: input { background: #00b7ea; background: url(data:imag
现在这个遗留代码是多个项目,每个项目都有自己的解决方案。每个项目通过它编译的 dll 引用另一个项目。要让主项目运行,您必须以正确的顺序进行 10 多个单独的构建。 我试图解释如何将所有项目移动到一个
我在 Visual Studio 2013 中处理我的项目,我错误地点击了 Rebuild Solution。我收到以下异常,我不知道如何解决它。请建议。 Server Error in '/' Ap
class solution { void table(final int n) { for (int i = 1; i <= 10; i++) { S
我非常需要了解如何使用 Visual Studio 2010 在 c# 中管理一些非常基本的体系结构问题,而且我在教科书和网站上寻找解决方案时遇到了一些困难。假设我有一个 MyWinForm.sln
我有 Java 背景,正在尝试从 C# 开始。 我想用 C# 创建一个将在其他解决方案中使用的库。在 Eclipse 中,只需创建一个 jar 并将其添加到类路径中即可。我知道VS2013中的每个项目
在我目前的工作中,我需要打开 3 个不同的解决方案,构建并运行它们。是否有任何脚本可以像我单击 Web 服务的“构建解决方案”或“启动”或“Google Chrome”一样执行工作人员? 谢谢。 最佳
有什么方法可以告诉Visual Studio 2005的解决方案资源管理器在svn-checkout后第一次打开解决方案时不要扩展所有项目? 编辑: 感谢您指出 PowerCommands。当我使用带
我的 Visual Studio 解决方案的 Subversion 存储库中有以下目录: 项目名称 标签 分支机构 后备箱 我的解决方案.sln MyProject1(目录) MyProject2(目
我刚刚使用 Update 2 更新了 Visual Studio 2015。 现在,经过几个小时的正常工作,我收到:“检测到内存不足。对此解决方案禁用了完整的解决方案分析。”出现在我的 VS2015
在 Visual Studio Code 中,单击我的测试项目中的“调试测试”代码镜头链接: 导致错误信息: MSBUILD : error MSB1011: Specify which projec
我是Docker的新手,正在尝试为ASP.NET Core应用程序创建Dockerfile。有人可以建议我需要哪些更改吗? 这是我的Dockerfile: FROM microsoft/dotnet:
我的入门类(class)的这个实验要求我们以 pig 拉丁语返回任何用户输入。当我运行它并在控制台中输入任何字符串时,我似乎不断收到的错误是: java.lang.StringIndexOutO
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 11 个月前关闭。 Improv
我的 C++ Concert Cplex 有问题。我正在尝试重新创建最短路径问题。输出到文本文件是: Minimize obj: 2 x_12 + x_13 + 2 x_21 + x_24 + x_
有时,当我浏览我的头文件时,我想在 (doxygen) 文档中添加一些小东西。这可能是关于使用某些函数参数的快速说明,或者只是修复了一个小错字。 但后来我想:哦不,这会在下一个 make 调用时触发重
我正在使用缺少 findall 的高阶 Prolog 变体. 还有一个关于实现我们自己的问题 findall这里:Getting list of solutions in Prolog . 低效的实现
如果您的应用程序必须对大尺寸对象(> 85000 字节)进行大量分配/取消分配,则最终会导致内存碎片,并且您的应用程序将抛出内存不足异常。 这个问题有什么解决方案,还是CLR内存管理的限制? 最佳答案
我是一名优秀的程序员,十分优秀!