Scheme 方案程序毫无例外地冻结
好的,我要上大学的计划课,我们刚拿到第一份作业。我正在经历这件可怕的事情。有时程序会冻结,在不给我任何警告的情况下什么都不做,这是为什么 采取以下步骤:Scheme 方案程序毫无例外地冻结,scheme,racket,Scheme,Racket,好的,我要上大学的计划课,我们刚拿到第一份作业。我正在经历这件可怕的事情。有时程序会冻结,在不给我任何警告的情况下什么都不做,这是为什么 采取以下步骤: (define (calc-week-day y1 m d w y2) ; anta y2 > y1 (define (days-between-months m1 m2 y) (if (= m1 m2) 0 (+ (month-length y m1) (days-between-months
(define (calc-week-day y1 m d w y2) ; anta y2 > y1
(define (days-between-months m1 m2 y)
(if (= m1 m2)
0
(+ (month-length y m1) (days-between-months (+ m1 1) m2 y))))
(define (days-between-years y1 y2)
(if (= y1 y2)
0
(+ (year-length y1) (days-between-years (+ y1 1) y2))))
(define (days-til-months-end d m y)
(- (month-length y m) d))
(define (calculate-day day offset)
(cond ((> day 6) (calculate-day 0 (- offset 1)))
((= offset 0) day)
(else (calculate-day (+ day 1) (- offset 1)))))
(define dager-til-nyttår (+ (days-between-months m 12 y1)
(days-til-months-end d 12 y1) 1))
(define dager-fra-nyttår (+ (days-between-months 1 m y2) d 2))
(define dager-mellom-datoer (+ dager-til-nyttår (days-between-years y1 y2)
dager-fra-nyttår))
(num->day (calculate-day (day->num w) dager-mellom-datoer)))
calc week day
基本上需要两年的时间,而y2>y1
总是如此。m=月,d=日,w=一周中的某一天(星期一、星期二…),该函数计算出y1
和y2
中相同日期之间的天数差,并计算出y2
中的一周中的某一天
这个程序没有按它应该的那样工作。这实际上不会产生任何产出。但是,如果我从(define dager fra nyttår…
中删除最后一个数字(2),它工作正常,并将一周中的某一天显示到输出屏幕(尽管不是正确的日期)
有人知道这是为什么吗?(在Mac OSX Lion上使用Racket 5.2)听起来你好像陷入了无限循环 我猜不是月与月之间的
天
就是年与年之间的天
在无休止地呼唤自己
例如,月与月之间的天数
似乎假定m1
m2
,它看起来会一直称自己为“永远”——不断尝试增加m1
,直到它等于m2
,但它永远不会,因为它已经更大了。(好吧,“从不”,或者至少在整数值结束之前的很长一段时间内。)
实际上,有两种方法可以解决这个问题
- “防御性编程”方法是将
测试从if
更改为(=m1m2)
(听起来你好像陷入了无限循环 我猜不是月与月之间的
就是年与年之间的天
在无休止地呼唤自己 例如,天
似乎假定月与月之间的天数
m1
,它看起来会一直称自己为“永远”——不断尝试递增m2
,直到它等于m1
,但它永远不会,因为它已经更大了。(嗯,“永远不会”,或至少在整数值结束之前的很长一段时间内。) 实际上,有两种方法可以解决这个问题m2
- “防御性编程”方法是将
测试从if
更改为(=m1m2)
(您有任何助手函数的测试用例吗?您知道您的助手函数是否工作吗?这并不像一开始看起来那么轻率。我不相信calculate day在所有预期条件下都会终止。例如,如果您通过一个大于6且偏移量等于零的日期,它将不会终止。)e、 顺便说一句,如果你正在使用DrRacket,试着按下停止按钮。它会告诉你程序的大致计算位置。可能会给出无限循环发生在哪里的提示。助手是由教授编写的,已经使用了至少几年,所以我想他们的工作方式与广告中的一样,即使有没有提供测试用例…所谓“助手函数”,我指的是calc week day中所有内部定义的函数。想必,你的教授没有编写这些函数,否则你还有什么要做的呢?:)此外,当您在追踪看似无限循环的内容时寻求帮助时,请提供示例输入,以便希望提供帮助的人可以复制您的场景。您将哪些输入传递到calc week day中,如果程序正常工作,您希望看到什么?您是否有任何帮助函数的测试用例?您是否同意现在,如果您的任何助手函数都能工作?这并不像一开始看起来那么轻率。我不相信计算日在所有预期条件下都会终止。例如,如果您传递的日期大于6且偏移量等于零,它将不会终止。顺便说一句,如果您正在使用DrRacket,请尝试按Stop,但它应该告诉你你的程序在哪里进行计算。可能会给出无限循环发生在哪里的提示。助手是由教授编写的,并且已经使用了至少两年,所以我假设它们按照广告的方式工作,即使没有“助手函数”提供的测试用例,我指的是calc week day中所有内部定义的函数。大概你的教授没有写这些函数,否则你还有什么要做的呢?:)另外,当你在追踪看似无限循环的过程中寻求帮助时,请提供示例输入,以便希望提供帮助的人可以复制你的场景。你将哪些输入传递到calc week day中,如果程序正常工作,你希望看到什么?嗯,听起来似乎有道理。阅读此代码并不像阅读那么容易Javascipt或我用过的Java,这可能是我自己没有发现这个问题的原因……我下班后会测试一下,看看这是否是我想要的答案。同时,我会投票给你一个好答案=)一旦你的大脑重新布线,阅读它会变得更容易。不久,你就可以在阅读
语言和{}
语言之间切换——就像在阅读英语和挪威语之间切换一样简单。:)嗯,听起来很有道理。阅读这段代码不像阅读Javascipt或Java那么容易,因为我也用过,这可能就是为什么我自己没有发现这一点。。。我下班后会测试一下,看看这是否是我想要的答案。与此同时,我会投票给你一个很好的答案,一旦你的大脑重新布线,阅读就会变得容易。不久,你就可以在阅读()
语言和{}
语言之间切换——就像在阅读英语和挪威语之间切换一样简单。:)()
- “防御性编程”方法是将