尾递归函数上的 StackOverflowError

2024-04-10

当我使用 (avg-bids 4000 10 5) 调用以下 Clojure 代码时,会导致 java.lang.StackOverflowError 。我试图找出原因,因为 sum-bids 是作为尾递归函数编写的,所以应该可以工作。使用 Clojure 1.2。

有谁知道为什么会发生这种情况?

(ns fixedprice.core
  (:use (incanter core stats charts)))

(def *bid-mean* 100)

(defn bid [x std-dev]
  (sample-normal x :mean *bid-mean* :sd std-dev))

(defn sum-bids [n offers std-dev]
  (loop [n n sum (repeat offers 0)]
    (if (zero? n)
      sum
      (recur (dec n) (map + sum (reductions min (bid offers std-dev)))))))

(defn avg-bids [n offers std-dev]
  (map #(/ % n) (sum-bids n offers std-dev))) 

map是懒惰的,并且您正在通过以下方式构建非常深层嵌套的映射映射recur。回溯有点神秘,但仔细观察你可以看到地图,地图,地图......

Caused by: java.lang.StackOverflowError
        at clojure.lang.LazySeq.seq(LazySeq.java:56)
        at clojure.lang.RT.seq(RT.java:450)
        at clojure.core$seq.invoke(core.clj:122)
        at clojure.core$map$fn__3699.invoke(core.clj:2099)
        at clojure.lang.LazySeq.sval(LazySeq.java:42)
        at clojure.lang.LazySeq.seq(LazySeq.java:56)
        at clojure.lang.RT.seq(RT.java:450)
        at clojure.core$seq.invoke(core.clj:122)
        at clojure.core$map$fn__3699.invoke(core.clj:2099)
        at clojure.lang.LazySeq.sval(LazySeq.java:42)
        at clojure.lang.LazySeq.seq(LazySeq.java:56)
        at clojure.lang.RT.seq(RT.java:450)
        at clojure.core$seq.invoke(core.clj:122)
        at clojure.core$map$fn__3699.invoke(core.clj:2099)
        at clojure.lang.LazySeq.sval(LazySeq.java:42)
        at clojure.lang.LazySeq.seq(LazySeq.java:56)
        at clojure.lang.RT.seq(RT.java:450)
        at clojure.core$seq.invoke(core.clj:122)
        at clojure.core$map$fn__3699.invoke(core.clj:2099)

修复它的一种方法是放置doall围绕它来战胜懒惰。

(defn sum-bids [n offers std-dev]
  (loop [n n sum (repeat offers 0)]
    (if (zero? n)
      sum
      (recur (dec n) (doall (map + sum (reductions min (bid offers std-dev))))))))

user> (avg-bids 4000 10 5)
(100.07129114746716 97.15856005697917 95.81372899072466 94.89235550905231 94.22478826109985 93.72441188690516 93.32420819224373 92.97449591314158 92.67155818823753 92.37275046342015)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尾递归函数上的 StackOverflowError 的相关文章

随机推荐

  • 即使用户不接受照片,相机意图 onActivityResult 代码也会保存(空白)图像

    当用户单击叉号不接受照片时 它会以与接受拍摄的照片时相同的方式结束意图 它将文件保存到设备库 但它是空白的 单击叉号不应该意味着 resultCode RESULT OK 吗 我还缺少一张支票吗 谢谢 这是代码 等等 我正在保存活动结果之前
  • 如何从 zip 中打开 html 文件?

    有什么方法可以从包含 html 引用的图像的 zip 文件中打开 html 文件吗 我生成带有资源相对路径的 html 但浏览器不会在 zip 文件中找到它们 我必须先将其提取 从拉链打开它是理想的选择 有什么办法可以做到吗 据我所知 只有
  • 创建 Angular/React 应用程序时的 .Net 本地主机服务器

    我正在使用 VS2017 2019 和 NET Core 2 1 来创建Angular or React应用程序 Angular CLI or create react app用于设置一切 以下所有内容都与开发阶段有关 当我们构建 NET
  • 针对数字板难题的优化 CLP(FD) 求解器

    考虑问题从https puzzling stackexchange com questions 20238 explore the square with 100 hops https puzzling stackexchange com
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 如何使用 Swift 在 stderr 上打印?

    我在 Linux 上使用 Swift 2 2 需要在标准错误流上编写一些调试输出 目前 我正在执行以下操作 import Foundation public struct StderrOutputStream OutputStreamTyp
  • 在没有窗口的windows桌面上绘制OpenGL

    我见过这样的事情 我想知道这是否可能 假设我运行我的应用程序 它会显示其下方的渲染结果 所以基本上 在没有窗口的情况下在屏幕上渲染 可能还是谎言 注意 想要在 Windows 和 C 中执行此操作 可以使用您的应用程序在其他应用程序的窗口上
  • Perl 函数中的引用返回值是否更好?

    与返回数组或哈希的引用相比 返回数组或哈希有哪些优缺点 对内存或执行时间有影响吗 两者在功能上有何区别 sub i return an array my a push things in a return a sub i return a
  • cudaMemcpyToSymbol 与 cudaMemcpy [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我试图找出
  • 我应该如何格式化 R mlogit 包的数据?

    我正在使用mlogit与 R 一起打包 使用以下方式导入我的数据后 t lt read csv junk csv header TRUE sep dec 并致电 x lt mlogit data t choice D shape long
  • 将接口方法作为参数传递

    Note 这很可能是非常C 特定语言问题 与以下无关WCF or web services at all 有3方ASMXWeb 服务 用于数据检索 我创建了一个名为的通用方法ExecuteCommand 用于针对 Web 服务的每个请求 该
  • FSharp.Data.JsonProvider - 从类型获取 json

    FSharp Data JsonProvider 提供了一种从 json 转换为 F 类型的方法 是否可以反向操作 即声明 FSharp Data JsonProvider 创建的类型之一的实例 将字段值设置为我需要的值 然后获取等效的 j
  • Pyenv 不自动激活

    我已经在我的环境中安装了 pyenv 直到这个周末 当我安装 Kivy 时 我的 pyenv 本地设置一直工作正常 但是现在 当我进入各个 python 项目目录时 pyenv 不会自动正确激活正确的 python 版本 E g 我像这样使
  • Spring Security 与 AcceptHeaderLocaleResolver 和 i18n

    我陷入困境 可能错过了文档中的某些内容或犯了一些小错误 Spring Security 3 0 5 已集成到我的 Spring MVC 3 0 5 应用程序中 AcceptHeaderLocaleResolver用于区域设置检测 除了安全错
  • Angular JS 2 npm 和 ng(Angular-Cli) 之间的区别(内置工具)

    在 AngularJS 2 中 NPM 和 NG Angular CLI 之间的主要区别是什么 如果通过 NPM 如果我们可以构建我们的应用程序并且它可以工作 那么 NG 构建 Angular cli 的需求是什么 npm start 与
  • SQLite3 .backup 和 .dump 命令是否锁定数据库?

    我能找到的唯一文档 backup and dump是由 help backup DB FILE Backup DB default main to FILE dump TABLE Dump the database in an SQL te
  • 使用泛型快速查找给定类的超级视图

    我想我正在与仿制药作斗争 我想创建简单的 UIView 扩展来递归地查找函数参数中传递的类的超级视图 我希望该函数返回可选的 显然包含 nil 或作为提供的类的实例可见的对象 extension UIView func superviewO
  • 强制 Internet Explorer 使用特定的 Java 运行时环境安装?

    当查看别人包含小程序的网页时 当我安装了多个 JRE 时 如何强制 Internet Explorer 6 0 使用特定的 JRE 首先 禁用当前安装的 Java 版本 要执行此操作 请转至控制面板 gt Java gt 高级 gt 浏览器
  • 没有要加载的文件——rest_client (Rails 3)

    当我做thin start 这是我得到的错误 thin start gt gt Using rack adapter rvm gems ruby 1 9 2 p0 gems activesupport 3 0 9 lib active su
  • 尾递归函数上的 StackOverflowError

    当我使用 avg bids 4000 10 5 调用以下 Clojure 代码时 会导致 java lang StackOverflowError 我试图找出原因 因为 sum bids 是作为尾递归函数编写的 所以应该可以工作 使用 Cl