递归的思维

递归是将问题规模一步一步降解到基准条件,而迭代是将基准条件赋给变量后,通过迭代修改变量来逼近问题。

比如求出指定月份所有日子以及对应的星期。这个问题首先要知道基准条件:1900年1月1日为星期一。然后再将该问题分成求出指定月份的第一天的星期。最后分解为指定年分的第一天的星期。

 1 function isBigYear(year)
 2     if year%4==0 and year%100~=0 or year%400 == 0 then
 3         return true
 4     end
 5     return false
 6 end
 7 
 8 function getYearDays(year)
 9     if isBigYear(year) then
10         return 366
11     end
12     return 365
13 end
14 
15 function getMonthDays(year, month)
16     if month == 2 then
17         if isBigYear(year) then
18             return 29
19         else
20             return 28
21         end
22     else
23         if month == 4 or month == 6 or month == 9 or month == 11 then
24             return 30
25         else
26             return 31
27         end
28     end
29 end
30 
31 function getYearStartWeek(year)
32     if year<1900 then return nil end
33     if year == 1900 then return 1 end
34     return (getYearStartWeek(year-1)+getYearDays(year-1))%7
35 end
36 
37 function getMonthStartWeek(year, month, start)
38     if start == nil then start = getYearStartWeek(year) end
39     if month == 1 then return start end
40     return (getMonthDays(year, month-1) + getMonthStartWeek(year, month-1, start))%7
41 end
42 
43 
44 function PrintCalendar(year, month)
45     local start = getMonthStartWeek(year, month)
46     local sum = getMonthDays(year, month)
47     local w = {
48         [0] = '',
49         [1] = '',
50         [2] = '',
51         [3] = '',
52         [4] = '',
53         [5] = '',
54         [6] = '',
55     }
56     for i = 1, sum do
57         print(year..''..month..''..i..''..'是星期'..w[(start+i-1)%7])
58     end
59 end
60 
61 PrintCalendar(2016, 6)

 

posted @ 2016-06-14 14:37  traits  阅读(1250)  评论(0编辑  收藏  举报