递归的思维
递归是将问题规模一步一步降解到基准条件,而迭代是将基准条件赋给变量后,通过迭代修改变量来逼近问题。
比如求出指定月份所有日子以及对应的星期。这个问题首先要知道基准条件: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)