1

我目前正在学习 CoffeeScript,因为它比 JavaScript 更具“表现力”,因此,我想知道如何优化下面的代码

lastDay = 6
weekdays = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
weeksToDivide = 0

for x in [1..9001] 
    if x % 5 == 0
        if x % 4 == 0
            if x % 3 == 0
                nextDay = x
                break               

totalDays = lastDay + nextDay
day = (totalDays -= 7 while totalDays > 7)
weekday = weekdays[day[day.length - 1] - 1]

alert "Days until next meeting: #{nextDay}"
alert "That day is on a #{weekday}"

我主要是在寻找一种优化 if 嵌套的方法,但任何其他提示也将不胜感激。

提前致谢。

编辑:
我很愚蠢,忘记了数学是如何工作的,谢谢 Zeta。另外,感谢 Epidemia 的进一步优化。

4

2 回答 2

0

这些优化与 CoffeeScript 关系不大:

首先,可以将嵌套if的 s 转换为链式ands,例如:

for x in [1..9001] 
  if x % 5 is 0 and x % 4 is 0 and x % 3 is 0 
    nextDay = x
    break

但是询问一个数字“x”是否能被 5整除、被 4整除和被 3 整除询问它是否能被这三个数字的最小公倍数(即 60)整除是一样的。所以循环相当于:

for x in [1..9001] 
  if x % 60 is 0 
    nextDay = x
    break

但是,那个循环总是会做同样的事情:分配nextDay给 60。所以它可以优化为一个单一的分配:

nextDay = 60

如果 5、4 和 3 除数不是常数并且您的算法应该能够有不同的除数,您可以将它们设置nextDay最小公倍数

然后,(totalDays -= 7 while totalDays > 7)循环创建一个数组,然后只使用它的最后一个元素。可以用模运算符替换逻辑:

totalDays = lastDay + nextDay - 1
weekday = weekdays[totalDays % 7]
于 2013-04-09T18:55:16.670 回答
0

您可以将循环缩短为(尽管您也可以这样做nextday = 60;-):

for x in [1..9001] when x % 60 is 0
  nextDay = x
  break
于 2013-04-13T17:14:28.197 回答