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那么容易,因为我也用过,这可能就是为什么我自己没有发现这一点。。。我下班后会测试一下,看看这是否是我想要的答案。与此同时,我会投票给你一个很好的答案,一旦你的大脑重新布线,阅读就会变得容易。不久,你就可以在阅读
      {}
      语言和
      ()
      语言之间切换——就像在阅读英语和挪威语之间切换一样简单。:)