程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何修复 Lisp 中的堆栈溢出错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何修复 Lisp 中的堆栈溢出错误?

开发过程中遇到如何修复 Lisp 中的堆栈溢出错误的问题如何解决?下面主要结合日常开发的经验,给出你关于如何修复 Lisp 中的堆栈溢出错误的解决方法建议,希望对你解决如何修复 Lisp 中的堆栈溢出错误有所启发或帮助;

我这里有一个代码,它试图得到给定数字以下所有质数的总和。当我运行它时,我不断收到堆栈溢出错误,仅此而已,而且我似乎找不到哪里出错了。

Type

解决方法

Stackoverflow 意味着内存部分,称为堆栈达到了它的限制。为了澄清,在堆栈上存储函数调用。现在,如果存储函数调用的内存部分达到其限制,则意味着发生了太多的函数调用。这通常意味着无限递归。想象一个只调用自身的函数。现在,如果您调用该函数,则该调用将存储在堆栈中。但是,该函数调用自身并且第二次调用也存储在堆栈中。而第二次调用是第三次调用该函数,该函数存储在堆栈中,依此类推。

这种递归的错误使用可以通过查看代码的特定区域来解决,在这些区域中,一个函数被自己调用,或者更广泛地说,如果一个函数已经在堆栈上,但它正在被调用又打过来了。

这是您找出当前问题的解决方案并避免将来出现类似问题所需的理解。

,

sum-of-primes 缺少一些 基本条件,这会结束递归调用。这是主要问题,但是您的代码非常混乱,并且包含许多无用的全局变量。您应该避免使用全局变量并使用局部变量(由 let 或函数调用创建)。对于此示例,您根本不需要任何全局变量。

(defun sum-of-primes (num)
  (sum-of-primes-Help 0 num))

(defun sum-of-primes-Help (i num)
  (cond ((= i num) 0)
        ((primep i) (+ i (sum-of-primes-Help (+ i 1) num)))
        (t (sum-of-primes-Help (+ i 1) num))))
         
(defun primep (num)
    (primep-Help 2 num))

(defun primep-Help (i num)
  (cond ((= num 0) nil)
        ((= num 1) nil)
        ((= i num) t)
        ((= 0 (mod num i)) nil)
        (t (primep-Help (+ i 1) num))))

(defun program ()
  (format t "Enter your number ~%")
  (format t "Sum of primes is: ~s" 
          (sum-of-primes (read))))

然后您只需调用 (program)

大佬总结

以上是大佬教程为你收集整理的如何修复 Lisp 中的堆栈溢出错误全部内容,希望文章能够帮你解决如何修复 Lisp 中的堆栈溢出错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:如何修复