所以入學考試時,通常會考一題程式設計。而我那一年的考題是:「請把 1、2、3、4、5 的所有排列情形列出」。還好我大一計概被當,大四才重修,沒忘了什麼是 Fortran 及 PE2,於是寫這個程式對我來說好像不會太難。
但主要的問題是那時的我認為程式設計只有 for loop + if..else.. 而已,所以一個該用遞迴寫的問題,我該如何實作。還好數學幫了我,因為在相同個數的自然數子集合中,其子集合的積及和必屬惟一值的特性,讓我用 5 個迴圈把問題解決,程式如下(因為我已忘了 Fortran ,所以用 Python 作範例):
1 for i1 in xrange(1,6):這個程式或許談不上美感,但它讓我滿意未來的發展。能如願進入中興營管學習 VB + Matlab + Linux + PHP + Open Source + 管理數學。
2 for i2 in xrange(1,6):
3 for i3 in xrange(1,6):
4 for i4 in xrange(1,6):
5 for i5 in xrange(1,6):
6 if i1*i2*i3*i4*i5 == 120 and (i1+i2+i3+i4+i5) == 15:
7 print '%d,%d,%d,%d,%d' % (i1, i2, i3, i4, i5)
而使用遞迴的方法如下:
1 def Line(ori, level, res):
2 if level == 0:
3 print ', '.join(res)
4 return
5
6 for i in xrange(len(ori)):
7 res.insert(0, ori[i])
8 tmp = ori[:]
9 null = tmp.pop(i)
10 Line(tmp, level-1, res)
11 res.pop(0)
12
13 ori = ['1','2','3', '4', '5']
14
15 Line(ori, len(ori), [])
用 stl 的 next_permutation 應該是最... 嗯... 省記憶體的作法 @@
回覆刪除嗯~~
回覆刪除太深了,不懂。
盼望能來個範例
回覆刪除