Memory 为什么这个代码会给我一个racket上内存不足的错误代码?

Memory 为什么这个代码会给我一个racket上内存不足的错误代码?,memory,racket,racket-student-languages,Memory,Racket,Racket Student Languages,我需要创建一个定义,根据绿色、黄色或红色的字符串输出交通灯的图片,并且无论字符串是什么,都可以确定哪个灯泡是实心的 (define green-light (overlay (above (circle 15 "solid" "green") (circle 15 "outline" "yellow") (circle 15 "outline" "red")) (rectangle 50 100 "

我需要创建一个定义,根据绿色、黄色或红色的字符串输出交通灯的图片,并且无论字符串是什么,都可以确定哪个灯泡是实心的

(define green-light
  (overlay (above (circle 15 "solid" "green")
                  (circle 15 "outline" "yellow")
                  (circle 15 "outline" "red"))
           (rectangle 50 100 "outline" "black")))

(define yellow-light
  (overlay (above (circle 15 "outline" "green")
                  (circle 15 "solid" "yellow")
                  (circle 15 "outline" "red"))
           (rectangle 50 100 "outline" "black")))

(define red-light
  (overlay (above (circle 15 "outline" "green")
                  (circle 15 "outline" "yellow")
                  (circle 15 "solid" "red"))
           ( rectangle 50 100 "outline" "black")))

(check-expect (TrafficLightState "green")
              (overlay (above (circle 15 "solid" "green")
                              (circle 15 "outline" "yellow")
                              (circle 15 "outline" "red"))
                       (rectangle 50 100 "outline" "black")))

(check-expect (TrafficLightState "yellow")
              (overlay (above (circle 15 "outline" "green")
                              (circle 15 "solid" "yellow")
                              (circle 15 "outline" "red"))
                       (rectangle 50 100 "outline" "black")))
(check-expect (TrafficLightState "red")
              (overlay (above (circle 15 "outline" "green")
                              (circle 15 "outline" "yellow")
                              (circle 15 "solid" "red"))
                       (rectangle 50 100 "outline" "black")))


(define (TrafficLightState color) 
  (cond [(TrafficLightState "green") (place-image green-light)]
        [(TrafficLightState "yellow") (place-image yellow-light)]
        [(TrafficLightState "red") (place-image red-light)]))

问题出在您的
TrafficLightState
功能中。如果您单击“检查语法”按钮并将鼠标悬停在DrRacket中的名称上,您将看到一些关于其错误的提示:

所有这些箭头都指向使用
TrafficLightState
功能的地方,实际上,它在内部被使用了三次。也就是说,
TrafficLightState
函数正在调用自己,这被称为递归函数

由于
TrafficLightState
不断地调用自身,它实际上进入了一个无限循环,消耗越来越多的内存,直到用完为止。这肯定不是您想要的,因此您应该重新考虑工作方式,并相应地调整您的函数以修复它


使用DrRacket中的步进器逐步执行程序可能会有帮助,以便准确了解正在发生的事情。单击菜单中的“步骤”按钮,然后单击箭头,一步一步地完成程序的执行。

看起来这与家庭作业有关。假设你正在学习一门基于“如何设计程序”的课程,你能告诉我们你在设计配方的哪一步吗?页眉部分我只需要使用形状创建一个红绿灯,我的检查有问题,所以我很困惑为什么没有,因为它是相同的代码哦?好吧,那样的话,我看不到任何目的陈述。你能添加它们吗?我相信DrRacket内置的步进器可能会帮助你了解这里发生了什么。(…作者说)。@JohnClements啊,我总是忘记步进机,主要是因为我从来没有真正经历过HtDP,所以我从来没有使用过。不过,这真的很酷,所以我肯定会在我的答案中添加一个注释。你应该提到,在教学语言中,这些箭头只有在你点击检查语法时才可见button@AlexKnauth啊,说得好。在回答中注意到并提到。