如何修复 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)