當前位置:首頁 » 編程語言 » 逆康托展開C語言代碼
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

逆康托展開C語言代碼

發布時間: 2022-10-31 12:31:41

1. 現代計算機是如何計算圓周率的

可以用編程語言計算。以下是python語言

pi = 0.0

N = 100

for i in range(N):

pi += (1/pow(16,i) * ( 4/(8*i +1) -2/(8*i+4)-1/(8*i+5) -1/(8*i +6) ) )

print('圓周率為{:.10f}'.format(pi))

請把以上代碼拷進python語言開發環境里運行,結果如下(下圖是使用python開發環境Spyder運行上述代碼的結果):圓周率為3.1415926536

(1)逆康托展開C語言代碼擴展閱讀

電子計算機的出現使π值計算有了突飛猛進的發展。1949年,美國製造的世上首部電腦-ENIAC(ElectronicNumerical Integrator And Computer)在阿伯丁試驗場啟用了。次年,里特韋斯納、馮紐曼和梅卓普利斯利用這部電腦,計算出π的2037個小數位。

這部電腦只用了70小時就完成了這項工作,扣除插入打孔卡所花的時間,等於平均兩分鍾算出一位數。五年後,IBM NORC(海軍兵器研究計算機)只用了13分鍾,就算出π的3089個小數位。

2. ACM進階指南

大一上學期:
必學:
1.C語言基礎語法必須全部學會
a)推薦「語言入門」分類20道題以上
b)提前完成C語言課程設計
2.簡單數學題(推薦「數學」分類20道以上)
需要掌握以下基本演算法:
a)歐幾里德演算法求最大公約數
b)篩法求素數
c)康托展開
d)逆康托展開
e)同餘定理
f)次方求模
3.計算幾何初步
a)三角形面積
b)三點順序
4.學會簡單計算程序的時間復雜度與空間復雜度
5.二分查找法
6.簡單的排序演算法
a)冒泡排序法
b)插入排序法
7.貪心演算法經典題目
8.高等數學
以下為選修:
9.學會使用簡單的DOS命令(較重要)
a)color/dir//shutdown/mkdir(md)/rmdir(rd)/attrib/cd/
b)知道什麼是絕對路徑與相對路徑
c)學會使用C語言調用DOS命令
d)學會在命令提示符下調用你自己用C語言編寫的程序,並使用命令行參數給自己的程序傳參(比如自己製作一個file.exe實現與命令基本功能一致的功能)
e)學會編寫bat批處理文件
10.學會Windows系統的一些小知識,如設置隱藏文件,autoRun.inf的設置等。
11.學會編輯注冊表(包括使用注冊表編輯器regedit和使用DOS命令編輯注冊表)
12.學會使用組策略管理器管理(gpedit.msc)組策略。
大一下學期:
1.掌握C++部分語法,如引用類型,函數重載等,基本明白什麼是類。
2.學會BFS與DFS
a)迷宮求解(最少步數)
b)水池數目(NYOJ27)
c)圖像有用區域(NYOJ92)
d)樹的前序中序後序遍歷
3.動態規劃(15題以上),要學會使用循環的方法寫動態規劃,同時也要學會使用記憶化搜索的方法。
a)最大子串和
b)最長公共子序列
c)最長單調遞增子序列(O(n)與O(n log n)演算法都需要掌握)
d)01背包
e)RMQ演算法
4.學會分析與計算復雜程序的時間復雜度
5.學會使用棧與隊列等線性存儲結構
6.學會分治策略
7.排序演算法
a)歸並排序
b)快速排序
c)計數排序
8.數論
a)擴展歐幾里德演算法
b)求逆元
c)同餘方程
d)中國剩餘定理
9.博弈論
a)博弈問題與SG函數的定義
b)多個博弈問題SG值的合並
10.圖論:
a)圖的鄰接矩陣與鄰接表兩種常見存儲方式
b)歐拉路的判定
c)單最短路bellman-ford演算法dijkstra演算法。
d)最小生成樹的kruskal演算法與prim演算法。
11.學會使用C語言進行網路編程與多線程編程
12.高等數學
13.線性代數
a)明確線性代數的重要性,首先是課本必須學好
b)編寫一個Matrix類,進行矩陣的各種操作,並求編寫程序解線性方程組。
c)推薦做一兩道「矩陣運算」分類下的題目。
以下為選修,隨便選一兩個學學即可:
14.(較重要)使用C語言或C++編寫簡單程序來調用一些簡單的windows API,或者在linux下進行linux系統調用,其目的是明白什麼是API(應用程序介面)。
15.網頁設計
a)學習靜態網頁技術(html+css+javascript)
b)較具有藝術細胞的可以試試Photoshop
c)php或其它動態網頁技術
16.學習matlab,如果想參加數學建模大賽的話,需要學這個軟體。
大一假期(如果留校集訓)
1.掌握C++語法,並熟練使用STL
2.試著實現STL的一些基本容器和函數,使自己基本能看懂STL源碼
3.圖論
a)使用優先隊列優化Dijkstra和Prim
b)單源最短路徑之SPFA
c)差分約束系統
d)多源多點最短路徑之FloydWarshall演算法
e)求歐拉路(圈套圈演算法)
4.進行復雜模擬題訓練
5.拓撲排序
6.動態規劃進階
a)完全背包、多重背包等各種背包問題(參見背包九講)
b)POJ上完成一定數目的動態規劃題目
c)狀態壓縮動態規劃
d)樹形動態規劃
7.搜索
a)回溯法熟練應用
b)復雜的搜索題目練習
c)雙向廣度優先搜索
d)啟發式搜索(包括A*演算法,如八數碼問題)
8.計算幾何
a)判斷點是否在線段上
b)判斷線段相交
c)判斷矩形是否包含點
d)判斷圓與矩形關系
e)判斷點是否在多邊形內
f)判斷點到線段的最近點
g)計算兩個圓的公切線
h)求矩形的並的面積
i)求多邊形面積
j)求多邊形重心
k)求凸包
選修
9.可以學習一種C++的開發框架來編寫一些窗體程序玩玩(如MFC,Qt等)。
10.學習使用C或C++連接資料庫
大二一整年:
1.數據結構
a)單調隊列
b)堆
c)並查集
d)樹狀數組
e)哈希表
f)線段樹
g)字典樹
2.圖論
a)強連通分量
b)雙連通分量(求割點,橋)
c)強連通分量與雙連通分量縮點
d)LCA、LCA與RMQ的轉化
e)二分圖匹配
i.二分圖最大匹配
ii.最小點集覆蓋
iii.最小路徑覆蓋
iv.二分圖最優匹配
v.二分圖多重匹配
f)網路流
i.最大流的基本SAP
ii.最大流的ISAP或者Dinic等高效演算法(任一)
iii.最小費用最大流
iv.最大流最小割定理
3.動態規劃多做題提高(10道難題以上)
4.數論
a)積性函數的應用
b)歐拉定理
c)費馬小定理
d)威樂遜定理
5.組合數學
a)群論基礎
b)Polya定理與計數問題
c)Catalan數
6.計算幾何
a)各種旋轉卡殼相關演算法
b)三維計算幾何演算法
7.理解資料庫原理,學會SQL語句
8.學好計算機組成原理
9.學習Transact-SQL語言,學會使用觸發器,存儲過程,學會資料庫事務等。
10.圖論二
a)網路流的各種構圖訓練(重要)
b)最小割與最小點權覆蓋等的關系(詳見《最小割模型在信息學競賽中的應用》一文)
c)次小生成樹
d)第k短路
e)最小比率生成樹
11.線性規劃
12.動態規劃更高級進階
13.KMP演算法
14.AC自動機理論與實現
15.博弈論之Alpha-beta剪枝

3. 怎樣學好初三的幾何初一不錯,初二退步,初三感覺更吃力是怎麼回事請教專家,非常感謝

幾何學發展
幾何學發展歷史悠長,內容豐富。它和代數、分析、數論等等關系極其密切。 幾何思想是數學中最重要的一類思想。目前的數學各分支發展都幾何化趨向,即用幾何觀點及思想方法去探討各數學理論。
平面幾何立體幾何
最早的幾何學當屬 平面幾何。 平面幾何就是研究平面上的直線和二次曲線(即圓錐曲線, 就是橢圓、雙曲線和拋物線)的幾何結構和度量性質(面積、長度、角度)。平面幾何採用了公理化方法, 在數學思想史上具有重要的意義。 平面幾何的內容也很自然地過渡到了三維空間的立體幾何。 為了計算體積和面積問題, 人們實際上已經開始涉及微積分的最初概念。 笛卡爾引進坐標系後, 代數與幾何的關系變得明朗, 且日益緊密起來。 這就促使了解析幾何的產生。解析幾何是由笛卡爾、費馬分別獨立創建的。這又是一次具有里程碑意義的事件。從解析幾何的觀點出發, 幾何圖形的性質可以歸結為方程的分析性質和代數性質。 幾何圖形的分類問題(比如把圓錐曲線分為三類),也就轉化為方程的代數特徵分類的問題, 即尋找代數不變數的問題。 立體幾何歸結為三維空間解析幾何的研究范疇, 從而研究二次曲面(如球面,橢球面、錐面、雙曲面,鞍面)的幾何分類問題, 就歸結為研究代數學中二次型的不變數問題。 總體上說, 上述的幾何都是在歐氏空間的幾何結構--即平坦的空間結構--背景下考察, 而沒有真正關注彎曲空間 下的幾何結構。歐幾里得幾何公理本質上是描述平坦空間的幾何特性,特別是第五公設引起了人們對其正確性的疑慮。 由此人們開始關注其彎曲空間的幾何, 即「非歐幾何 」。 非歐幾何中包括了最經典幾類幾何學課題, 比如「球面幾何」,「羅氏幾何 」等等。另一方面, 為了把無窮遠的那些虛無縹緲的點也引入到觀察范圍內, 人們開始考慮射影幾何。 這些早期的非歐幾何學總的來說,是研究非度量的性質,即和度量關系不大, 而只關注幾何對象的位置問題--比如平行、相交等等。 這幾類幾何學所研究的空間背景都是彎曲的空間。
微分幾何
為了引入彎曲空間的上的度量(長度、面積等等), 我們就需要引進微積分的方法去局部分析空間彎曲的性質。微分幾何 於是應運而生。 研究曲線和曲面的微分幾何稱為古典微分幾何。 但古典微分幾何討論的對象必須事先嵌入到歐氏空間里,才定義各種幾何概念等等(比如切線、曲率)。 一個幾何概念如果和幾何物體所處的空間位置無關,而只和其本身的性態相關,我們就說它是內蘊的。 用物理的語言來說, 就是幾何性質必須和參考系選取無關。
內蘊幾何
哪些幾何概念是內蘊性質的? 這是當時最重要的理論問題。 高斯發現了曲面的曲率(即反映彎曲程度的量)竟然是內蘊的---盡管它的原始定義看上去和所處的大空間位置有關。 這個重要發現就稱為高斯絕妙定理。古典幾何的另一個重要發現就是高斯-博納特公式, 它反映了曲率和彎曲空間里的三角形三角之和的關系。 研究內蘊幾何的學科首屬黎曼幾何 · 黎曼在一次著名的演講中,創立了這門奠基性的理論。 它首次強調了內蘊的思想, 並將所有此前的幾何學對象都歸納到更一般的范疇里, 內蘊地定義了諸如度量等等的幾何概念。 這門幾何理論打開了近代幾何學的大門, 具有里程碑的意義。它也成為了愛因斯坦的廣義相對論的數學基礎。 從黎曼幾何出發, 微分幾何進入了新的時代,幾何對象擴展到了流形(一種彎曲的幾何物體)上--這一概念由龐加萊引入。 由此發展出了諸如張量幾何、黎曼曲面理論、復幾何、霍奇理論、纖維叢理論、芬斯勒幾何 、莫爾斯理論、形變理論等等。 從代數的角度看, 幾何學從傳統的解析幾何發展成了更一般的一門理論--代數幾何。傳統代數幾何就是研究多項式方程組的零點集合作為幾何物體所具有的幾何結構和性質--這種幾何體叫做代數簇。 解析幾何所研究的直線、圓錐曲線、球面、錐面等等都是其中的特例。稍微推廣一些,就是代數曲線, 特別是平面代數曲線, 它相應於黎曼曲面。代數幾何可以用交換代數的環和模的語言來描述, 也可以從復幾何、霍奇理論等分析的方法去探討。 代數幾何的思想也被引入到數論中, 從而促使了抽象代數幾何的 發展,比如算術代數幾何。
拓撲學
和傳統幾何密切相關的一門重要學科,就是拓撲學。 它也可以視為一種「柔性」的幾何學, 也是所有幾何學的研究基礎。 這門學科的雛形由龐加萊創造, 後來發展成了成熟的數學理論。 拓撲學思想是數學思想中極為關鍵的內容。它討論了刻畫幾何物體最基本的一些特徵, 比如虧格(洞眼個數)等等 。由此還發展出了同調論、同倫論等等基礎性的理論。
其他的集合學科
除了以上傳統幾何學之外, 我們還有閔可夫斯基建立的「數的幾何」 ; 與近代物理學密切相關的新學科「熱帶幾何」;探討維數理論的「分形幾何」;還有「凸幾何」、「組合幾何」、「計算幾何」、「排列幾何」、「直觀幾何」等等。
編輯本段幾何作圖
三大問題
古希臘幾何作圖的三大問題是: ①化圓為方,求作一正方形,使其面積等於一已知圓; ②三等分任意角; ③倍立方,求作一立方體,使其體積是一已知立方體的兩倍。這些問題的難處,是作圖只許用直尺(沒有刻度,只能作直線的尺)和圓規。 經過兩千多年的探索,最後才證明在尺規的限制下,根本不可能作出所要求的圖形。 希臘人強調作圖只能用直尺圓規,有下列原因。①希臘幾何的基本精神,是從極少的基本假定(定義、公理、公設)出發,推導出盡可能多的命題。對於作圖工具,自然也相應地限制到不能再少的程度。②受柏拉圖哲學思想的影響。柏拉圖片面強調數學在訓練智力方面的作用而忽視其實用價值。他主張通過幾何學習達到訓練邏輯思維的目的,因此工具要有所限制,正象體育競賽要有器械的限制一樣。③以畢達哥拉斯學派為代表的希臘人認為圓是最完美的平面圖形,圓和直線是幾何學最基本的研究對象。有了尺規,圓和直線已經能夠作出,因此就規定只使用這兩種工具。歷史上最早明確提出尺規限制的是伊諾皮迪斯,以後逐漸成為一種公約,最後總結在歐幾里得的《幾何原本》之中。
尺規作圖
公元前5世紀,雅典的「智人學派」以上述三大問題為中心,開展研究。正因為不能用尺規來解決,常常使人闖入新的領域中去。例如激發了圓錐曲線、割圓曲線以及三、四次代數曲線的發現。 17世紀解析幾何建立以後,尺規作圖的可能性才有了准則。1837年P.L.旺策爾給出三等分任意角和倍立方不可能用尺規作圖的證明,1882年C.L.F.von林德曼證明了 π的超越性,化圓為方的不可能性也得以確立。1895年(C.)F.克萊因總結了前人的研究,著《幾何三大問題》(中譯本,1930)一書,給出三大問題不可能用尺規來作圖的簡明證法,徹底解決了兩千多年的懸案。 雖然如此,還是有許多人不管這些證明,想壓倒前人所有的工作。他們宣稱自己已解決了三大問題中的某一個,實際上他們並不了解所設的條件和不可解的道理。三大問題不能解決,關鍵在工具的限制,如果不限工具,那就根本不是什麼難題,而且早已解決。例如阿基米德就曾用巧妙的方法三等分任意角。下面為了敘述簡單,將原題稍加修改。在直尺邊緣上添加一點p,命尺端為O。設所要三等分的角是∠ACB,以C為心,Op為半徑作半圓交角邊於A、B;使O點在CA延線上移動,p點在圓周上移動,當尺通過B時,聯OpB(見圖)。由於Op=pC=CB,易知 。 ∠COB=1/3∠ACB 這里使用的工具已不限於尺規,而且作圖方法也與公設不合。另外兩個問題也可以用別的工具解決。
編輯本段歐幾里得和《幾何原本》
歐幾里得在公元前300年左右,曾經到亞歷山大城教學,是一位受人尊敬的、溫良敦厚的教育家。他酷愛數學,深知柏拉圖的一些幾何原理。他非常詳盡的搜集了當時所能知道的一切幾何事實,按照柏拉圖和亞里士多德提出的關於邏輯推理的方法,整理成一門有著嚴密系統的理論,寫成了數學史上早期的巨著——《幾何原本》。
歷史意義
《幾何原本》的偉大歷史意義在於,它是用公理法建立起演繹的數學體系的最早典範。在這部著作里,全部幾何知識都是從最初的幾個假設除法、運用邏輯推理的方法展開和敘述的。也就是說,從《幾何原本》發表開始,幾何才真正成為了一個有著比較嚴密的理論系統和科學方法的學科。
幾何原本內容
歐幾里得的《幾何原本》共有十三卷,其中第一卷講三角形全等的條件,三角形邊和角的大小關系,平行線理論,三角形和多角形等積(面積相等)的條件;第二卷講如何把三角形變成等積的正方形;第三卷講圓;第四卷討論內接和外切多邊形;第六卷講相似多邊形理論;第五、第七、第八、第九、第十卷講述比例和算術得里論;最後講述立體幾何的內容。 從這些內容可以看出,目前屬於中學課程里的初等幾何的主要內容已經完全包含在《幾何原本》里了。因此長期以來,人們都認為《幾何原本》是兩千多年來傳播幾何知識的標准教科書。屬於《幾何原本》內容的幾何學,人們把它叫做歐幾里得幾何學,或簡稱為歐式幾何。
主要的特色
《幾何原本》最主要的特色是建立了比較嚴格的幾何體系,在這個體系中有四方面主要內容,定義、公理、公設、命題(包括作圖和定理)。《幾何原本》第一卷列有23個定義,5條公理,5條公設。(其中最後一條公設就是著名的平行公設,或者叫做第五公設。它引發了幾何史上最著名的長達兩千多年的關於「平行線理論」的討論,並最終誕生了非歐幾何。) 這些定義、公理、公設就是《幾何原本》全書的基礎。全書以這些定義、公理、公設為依據邏輯地展開他的各個部分的。比如後面出現的每一個定理都寫明什麼是已知、什麼是求證。都要根據前面的定義、公理、定理進行邏輯推理給予仔細證明。
幾何論證的方法
關於幾何論證的方法,歐幾里得提出了分析法、綜合法和歸謬法。所謂分析法就是先假設所要求的已經得到了,分析這時候成立的條件,由此達到證明的步驟;綜合法是從以前證明過的事實開始,逐步的導出要證明的事項;歸謬法是在保留命題的假設下,否定結論,從結論的反面出發,由此導出和已證明過的事實相矛盾或和已知條件相矛盾的結果,從而證實原來命題的結論是正確的,也稱作反證法。 歐幾里得《幾何原本》的誕生在幾何學發展的歷史中具有重要意義。它標志著幾何學已成為一個有著比較嚴密的理論系統和科學方法的學科。
編輯本段希爾伯特《幾何基礎》
建立公理系統的原則
人們對《幾何原本》中在邏輯結果方面存在的一些漏洞、破綻的發現,正是推動幾何學不斷向前發展的契機。最後德國數學家希爾伯特在總結前人工作的基礎上,在他1899年發表的《幾何基礎》一書中提出了一個比較完善的幾何學的公理體系。這個公理體系就被叫做希爾伯特公理體。 希爾伯特不僅提出了—個完善的幾何體系,並且還提出了建立一個公理系統的原則。就是在一個幾何公理系統中,採取哪些公理,應該包含多少條公理,應當考慮如下三個方面的問題: 第一,共存性(和諧性),就是在一個公理系統中,各條公理應該是不矛盾的,它們和諧而共存在同一系統中。 第二,獨立性,公理體系中的每條公理應該是各自獨立而互不依附的,沒有一條公理是可以從其它公理引伸出來的。 第三,完備性,公理體系中所包含的公理應該是足夠能證明本學科的任何新命題。 這種用公理系統來定義幾何學中的基本對象和它的關系的研究方法,成了數學中所謂的「公理化方法」,而把歐幾里得在《幾何原本》提出的體系叫做古典公理法。
意義
公理化的方法給幾何學的研究帶來了一個新穎的觀點,在公理法理論中,由於基本對象不予定義,因此就不必探究對象的直觀形象是什麼,只專門研究抽象的對象之間的關系、性質。從公理法的角度看,我們可以任意地用點、線、面代表具體的事物,只要這些具體事物之間滿足公理中的結合關系、順序關系、合同關系等,使這些關系滿足公理系統中所規定的要求,這就構成了幾何學。 因此,凡是符合公理系統的元素都能構成幾何學,每一個幾何學的直觀形象不止只有—個,而是可能有無窮多個,每一種直觀形象我們把它叫做幾何學的解釋,或者叫做某種幾何學的模型。平常我們所熟悉的幾何圖形,在研究幾何學的時候,並不是必須的,它不過是一種直觀形象而已。 就此,幾何學研究的對象更加廣泛了,幾何學的含義比歐幾里得時代更為抽象。這些,都對近代幾何學的發展帶來了深遠的影響。
一些平面幾何的著名定理
1、勾股定理(畢達哥拉斯定理) 2、射影定理(歐幾里得定理) 3、三角形的三條中線交於一點,並且,各中線被這個點分成2:1的兩部分 4、四邊形兩邊中心的連線與兩條對角線中心的連線交於一點 5、間隔的連接六邊形的邊的中心所作出的兩個三角形的重心是重合的。 6、三角形各邊的垂直平分線交於一點。 7、三角形的三條高線交於一點 8、設三角形ABC的外心為O,垂心為H,從O向BC邊引垂線,設垂足為L,則AH=2OL 9、三角形的外心,垂心,重心在同一條直線(歐拉線)上。 10、(九點圓或歐拉圓或費爾巴赫圓)三角形中,三邊中心、從各頂點向其對邊所引垂線的垂足,以及垂心與各頂點連線的中點,這九個點在同一個圓上, 11、歐拉定理:三角形的外心、重心、九點圓圓心、垂心依次位於同一直線(歐拉線)上 12、庫立奇*大上定理:(圓內接四邊形的九點圓) 圓周上有四點,過其中任三點作三角形,這四個三角形的九點圓圓心都在同一圓周上,我們把過這四個九點圓圓心的圓叫做圓內接四邊形的九點圓。 13、(內心)三角形的三條內角平分線交於一點,內切圓的半徑公式:r=(s-a)(s-b)(s-c)s,s為三角形周長的一半 14、(旁心)三角形的一個內角平分線和另外兩個頂點處的外角平分線交於一點 15、中線定理:(巴布斯定理)設三角形ABC的邊BC的中點為P,則有AB2+AC2=2(AP2+BP2) 16、斯圖爾特定理:P將三角形ABC的邊BC內分成m:n,則有n×AB2+m×AC2=(m+n)AP2+mnm+nBC2 17、波羅摩及多定理:圓內接四邊形ABCD的對角線互相垂直時,連接AB中點M和對角線交點E的直線垂直於CD 18、阿波羅尼斯定理:到兩定點A、B的距離之比為定比m:n(值不為1)的點P,位於將線段AB分成m:n的內分點C和外分點D為直徑兩端點的定圓周上 19、托勒密定理:設四邊形ABCD內接於圓,則有AB×CD+AD×BC=AC×BD 20、以任意三角形ABC的邊BC、CA、AB為底邊,分別向外作底角都是30度的等腰△BDC、△CEA、△AFB,則△DEF是正三角形, 21、愛爾可斯定理1:若△ABC和△DEF都是正三角形,則由線段AD、BE、CF的中心構成的三角形也是正三角形。 22、愛爾可斯定理2:若△ABC、△DEF、△GHI都是正三角形,則由三角形△ADG、△BEH、△CFI的重心構成的三角形是正三角形。 23、梅涅勞斯定理:設△ABC的三邊BC、CA、AB或其延長線和一條不經過它們任一頂點的直線的交點分別為P、Q、R則有 BPPC×CQQA×ARRB=1 24、梅涅勞斯定理的逆定理:(略) 25、梅涅勞斯定理的應用定理1:設△ABC的∠A的外角平分線交邊CA於Q、∠C的平分線交邊AB於R,、∠B的平分線交邊CA於Q,則P、Q、R三點共線。 26、梅涅勞斯定理的應用定理2:過任意△ABC的三個頂點A、B、C作它的外接圓的切線,分別和BC、CA、AB的延長線交於點P、Q、R,則P、Q、R三點共線 27、塞瓦定理:設△ABC的三個頂點A、B、C的不在三角形的邊或它們的延長線上的一點S連接面成的三條直線,分別與邊BC、CA、AB或它們的延長線交於點P、Q、R,則BPPC×CQQA×ARRB()=1. 28、塞瓦定理的應用定理:設平行於△ABC的邊BC的直線與兩邊AB、AC的交點分別是D、E,又設BE和CD交於S,則AS一定過邊BC的中心M 29、塞瓦定理的逆定理:(略) 30、塞瓦定理的逆定理的應用定理1:三角形的三條中線交於一點 31、塞瓦定理的逆定理的應用定理2:設△ABC的內切圓和邊BC、CA、AB分別相切於點R、S、T,則AR、BS、CT交於一點。 32、西摩松定理:從△ABC的外接圓上任意一點P向三邊BC、CA、AB或其延長線作垂線,設其垂足分別是D、E、R,則D、E、R共線,(這條直線叫西摩松線) 33、西摩松定理的逆定理:(略) 34、史坦納定理:設△ABC的垂心為H,其外接圓的任意點P,這時關於△ABC的點P的西摩松線通過線段PH的中心。 35、史坦納定理的應用定理:△ABC的外接圓上的一點P的關於邊BC、CA、AB的對稱點和△ABC的垂心H同在一條(與西摩松線平行的)直線上。這條直線被叫做點P關於△ABC的鏡象線。 36、波朗傑、騰下定理:設△ABC的外接圓上的三點為P、Q、R,則P、Q、R關於△ABC交於一點的充要條件是:弧AP+弧BQ+弧CR=0(mod2∏). 37、波朗傑、騰下定理推論1:設P、Q、R為△ABC的外接圓上的三點,若P、Q、R關於△ABC的西摩松線交於一點,則A、B、C三點關於△PQR的的西摩松線交於與前相同的一點 38、波朗傑、騰下定理推論2:在推論1中,三條西摩松線的交點是A、B、C、P、Q、R六點任取三點所作的三角形的垂心和其餘三點所作的三角形的垂心的連線段的中點。 39、波朗傑、騰下定理推論3:考查△ABC的外接圓上的一點P的關於△ABC的西摩松線,如設QR為垂直於這條西摩松線該外接圓珠筆的弦,則三點P、Q、R的關於△ABC的西摩松線交於一點 40、波朗傑、騰下定理推論4:從△ABC的頂點向邊BC、CA、AB引垂線,設垂足分別是D、E、F,且設邊BC、CA、AB的中點分別是L、M、N,則D、E、F、L、M、N六點在同一個圓上,這時L、M、N點關於關於△ABC的西摩松線交於一點。 41、關於西摩松線的定理1:△ABC的外接圓的兩個端點P、Q關於該三角形的西摩松線互相垂直,其交點在九點圓上。 42、關於西摩松線的定理2(安寧定理):在一個圓周上有4點,以其中任三點作三角形,再作其餘一點的關於該三角形的西摩松線,這些西摩松線交於一點。 43、卡諾定理:通過△ABC的外接圓的一點P,引與△ABC的三邊BC、CA、AB分別成同向的等角的直線PD、PE、PF,與三邊的交點分別是D、E、F,則D、E、F三點共線。 44、奧倍爾定理:通過△ABC的三個頂點引互相平行的三條直線,設它們與△ABC的外接圓的交點分別是L、M、N,在△ABC的外接圓取一點P,則PL、PM、PN與△ABC的三邊BC、CA、AB或其延長線的交點分別是D、E、F,則D、E、F三點共線 45、清宮定理:設P、Q為△ABC的外接圓的異於A、B、C的兩點,P點的關於三邊BC、CA、AB的對稱點分別是U、V、W,這時,QU、QV、QW和邊BC、CA、AB或其延長線的交點分別是D、E、F,則D、E、F三點共線 46、他拿定理:設P、Q為關於△ABC的外接圓的一對反點,點P的關於三邊BC、CA、AB的對稱點分別是U、V、W,這時,如果QU、QV、QW與邊BC、CA、AB或其延長線的交點分別為ED、E、F,則D、E、F三點共線。(反點:P、Q分別為圓O的半徑OC和其延長線的兩點,如果OC2=OQ×OP 則稱P、Q兩點關於圓O互為反點) 47、朗古來定理:在同一圓同上有A1B1C1D14點,以其中任三點作三角形,在圓周取一點P,作P點的關於這4個三角形的西摩松線,再從P向這4條西摩松線引垂線,則四個垂足在同一條直線上。 48、九點圓定理:三角形三邊的中點,三高的垂足和三個歐拉點〔連結三角形各頂點與垂心所得三線段的中點〕九點共圓〔通常稱這個圓為九點圓〔nine-point circle〕,或歐拉圓,費爾巴哈圓. 49、一個圓周上有n個點,從其中任意n-1個點的重心,向該圓周的在其餘一點處的切線所引的垂線都交於一點。 50、康托爾定理1:一個圓周上有n個點,從其中任意n-2個點的重心向餘下兩點的連線所引的垂線共點。 51、康托爾定理2:一個圓周上有A、B、C、D四點及M、N兩點,則M和N點關於四個三角形△BCD、△CDA、△DAB、△ABC中的每一個的兩條西摩松的交點在同一直線上。這條直線叫做M、N兩點關於四邊形ABCD的康托爾線。 52、康托爾定理3:一個圓周上有A、B、C、D四點及M、N、L三點,則M、N兩點的關於四邊形ABCD的康托爾線、L、N兩點的關於四邊形ABCD的康托爾線、M、L兩點的關於四邊形ABCD的康托爾線交於一點。這個點叫做M、N、L三點關於四邊形ABCD的康托爾點。 53、康托爾定理4:一個圓周上有A、B、C、D、E五點及M、N、L三點,則M、N、L三點關於四邊形BCDE、CDEA、DEAB、EABC中的每一個康托爾點在一條直線上。這條直線叫做M、N、L三點關於五邊形A、B、C、D、E的康托爾線。 54、費爾巴赫定理:三角形的九點圓與內切圓和旁切圓相切。 55、莫利定理:將三角形的三個內角三等分,靠近某邊的兩條三分角線相得到一個交點,則這樣的三個交點可以構成一個正三角形。這個三角形常被稱作莫利正三角形。 56、牛頓定理1:四邊形兩條對邊的延長線的交點所連線段的中點和兩條對角線的中點,三條共線。這條直線叫做這個四邊形的牛頓線。 57、牛頓定理2:圓外切四邊形的兩條對角線的中點,及該圓的圓心,三點共線。 58、笛沙格定理1:平面上有兩個三角形△ABC、△DEF,設它們的對應頂點(A和D、B和E、C和F)的連線交於一點,這時如果對應邊或其延長線相交,則這三個交點共線。 59、笛沙格定理2:相異平面上有兩個三角形△ABC、△DEF,設它們的對應頂點(A和D、B和E、C和F)的連線交於一點,這時如果對應邊或其延長線相交,則這三個交點共線。 60、布利安松定理:連結外切於圓的六邊形ABCDEF相對的頂點A和D、B和E、C和F,則這三線共點。 61、巴斯加定理:圓內接六邊形ABCDEF相對的邊AB和DE、BC和EF、CD和FA的(或延長線的)交點共線。 62.秦九韶——海倫公式:已知三角形三邊:a,b,c計算三角形面積S S為根號下:p(p-a)(p-b)(p-c) p為該三角形周長的一半

4. 復數是什麼啊,為什麼C=a+bi

很簡單,就像是否人身體由幾個部分組成一樣,復數C也是由幾個部分組成.不要把它想得太玄.
復數是由兩個部分組成,即實部和虛部.如你列出來的一個式子,C代表一個復數的話,那麼a就是指它的實部,即實數部分,bi指它的虛部,也就是虛數部分.舉個例子.復數z=3+8i.它就是一個虛數.
這個東西很實在,別把它想得復雜了.它是一種數!也有混合運算的.實部就是實部虛部就是虛部.別把它們擰到一塊了,那樣會很讓你傷腦筋.
重要是在自己體會,順便說一下,隨著你學習的深入,你就覺得它是一個很自然的東西了,這是一個過程.不用超之過急去弄透它.
希望我的回答給你一些啟示.

5. C語言演算法BFS+HASH是什麼

就是 康托hash判重 P1029 的所謂的hash就是 康托展開(作用是判重)目標狀態就8種
276951438
294753618
438951276
492357816
618753294
672159834
816357492
834159672

由這八個BFS擴展,總共362880種狀態,共12種交換方法。 9 的全排列有 三十多萬 , 利用 康托 判斷出 當前搜索到的 序列 是這 三十多萬個排列方式中的第幾個, 以此來判重......

康托展開:
{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按從小到大排列一共6個 123 132 213 231 312 321代表的數字 1 2 3 4 5 6 也就是把10進制數與一個排列對應起來。他們間的對應關系可由康托展開來找到。 如我想知道321是{1,2,3}中第幾個大的數可以這樣考慮 第一位是3,當第一位的數小於3時,那排列數小於321 如 123 213 小於3的數有1,2 所以有2*2!個 再看小於第二位2的 小於2的數只有一個就是1 所以有1*1!=1 所以小於321的{1,2,3}排列數有2*2!+1*1!=5個所以321是第6個大的數。 2*2!+1*1!是康托展開 再舉個例子 1324是{1,2,3,4}排列數中第幾個大的數 第一位是1小於1的數沒有,是0個 0*3! 第二位是3小於3的數有1,2但1已經在第一位了所以只有一個數2 1*2! 第三位是2小於2的數是1,但1在第一位所以有0個數 0*1! 所以比1324小的排列有0*3!+1*2!+0*1!=2個 1324是第三個大數。

6. 康托展開

把一個整數X展開成如下形式:
X=a[n]*n!+a[n-1]*(n-1)!+...+a[2]*2!+a[1]*1!
其中,a為整數,並且0<=a<i,i=1,2,..,n
{1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按從小到大排列一共6個。123 132 213 231 312 321 。
代表的數字 1 2 3 4 5 6 也就是把10進制數與一個排列對應起來。
他們間的對應關系可由康托展開來找到。
如我想知道321是{1,2,3}中第幾個大的數可以這樣考慮 :
第一位是3,當第一位的數小於3時,那排列數小於321 如 123、 213 ,小於3的數有1、2 。所以有2*2!個。再看小於第二位2的:小於2的數只有一個就是1 ,所以有1*1!=1 所以小於321的{1,2,3}排列數有2*2!+1*1!=5個。所以321是第6個大的數。 2*2!+1*1!是康托展開。
再舉個例子:1324是{1,2,3,4}排列數中第幾個大的數:第一位是1小於1的數沒有,是0個 0*3! 第二位是3小於3的數有1和2,但1已經在第一位了,所以只有一個數2 1*2! 。第三位是2小於2的數是1,但1在第一位,所以有0個數 0*1! ,所以比1324小的排列有0*3!+1*2!+0*1!=2個,1324是第三個大數。

代碼(C語言):
unsigned long cantor(unsigned long S)
{
long x=0,i,p,k,j;
bool hash[8]=;
for (i=8;i>=2;i--)
{
k=S>> 3*(i-1);
S-=k<<3*(i-1);
hash[k]=true;
p=k;
for (j=0;j<=k-1;j++)
if (hash[j])
p--;
x+=fac[i-1]*p;
}
return x;
}
代碼(Pascal語言):
procere cantor;
var
i,j,temp:integer;
num:longint;
begin
num:=0;
for i:=1 to n-1 do
begin
temp:=s-1;
for j:=1 to i-1 do if s[j]<s then dec(temp);
num:=(num+temp)*(n-i);
end;
ans:=num+1;
end;

7. 康托的對角線證法

停機問題
不存在這樣一個程序(演算法),它能夠計算任何程序(演算法)在給定輸入上是否會結束(停機)。

那麼,如何來證明這個停機問題呢?反證。假設我們某一天真做出了這么一個極度聰明的萬能演算法(就叫God_algo吧),你只要給它一段程序(二進制描述),再給它這段程序的輸入,它就能告訴你這段程序在這個輸入上會不會結束(停機),我們來編寫一下我們的這個演算法吧:

bool God_algo(char* program, char* input)
{
if(<program> halts on <input>)
return true;
return false;
}

這里我們假設if的判斷語句裡面是你天才思考的結晶,它能夠像上帝一樣洞察一切程序的宿命。現在,我們從這個God_algo出發導出一個新的演算法:

bool Satan_algo(char* program)
{
if( God_algo(program, program) ){
while(1); // loop forever!
return false; // can never get here!
}
else
return true;
}

正如它的名字所暗示的那樣,這個演算法便是一切邪惡的根源了。當我們把這個演算法運用到它自身身上時,會發生什麼呢?

Satan_algo(Satan_algo);

我們來分析一下這行簡單的調用:

顯然,Satan_algo(Satan_algo)這個調用要麼能夠運行結束返回(停機),要麼不能返回(loop forever)。

如果它能夠結束,那麼Santa_algo演算法裡面的那個if判斷就會成立(因為God_algo(Santa_algo,Santa_algo)將會返回true),從而程序便進入那個包含一個無窮循環while(1);的if分支,於是這個Satan_algo(Satan_algo)調用便永遠不會返回(結束)了。

而如果Satan_algo(Satan_algo)不能結束(停機)呢,則if判斷就會失敗,從而選擇另一個if分支並返回true,即Satan_algo(Satan_algo)又能夠返回(停機)。

總之,我們有:

Satan_algo(Satan_algo)能夠停機=> 它不能停機
Satan_algo(Satan_algo)不能停機=> 它能夠停機

所以它停也不是,不停也不是。左右矛盾。

於是,我們的假設,即God_algo演算法的存在性,便不成立了。正如拉格朗日所說:「陛下,我們不需要(上帝)這個假設」[4]。

這個證明相信每個程序員都能夠容易的看懂。然而,這個看似不可捉摸的技巧背後其實隱藏著深刻的數學原理(甚至是哲學原理)。在沒有認識到這一數學原理之前,至少我當時是對於圖靈如何想出這一絕妙證明感到無法理解。但後面,在介紹完了與圖靈的停機問題「同構」的Y combinator之後,我們會深入哥德爾的不完備性定理,在理解了哥德爾不完備性定理之後,我們從這一同樣絕妙的定理出發,就會突然發現,離停機問題和神奇的Y combinator只是咫尺之遙而已。當然,最後我們會回溯到一切的盡頭,康托爾那裡,看看停機問題、Y combinator、以及不完備性定理是如何自然而然地由康托爾的對角線方法推導出來的,我們將會看到這些看似神奇的構造性證明的背後,其實是一個簡潔優美的數學方法在起作用。

Y Combinator
了解Y combinator的請直接跳過這一節,到下一節「哥德爾的不完備性定理」。

讓我們暫且擱下但記住繞人的圖靈停機問題,走進函數式編程語言的世界,走進由跟圖靈機理論等價的lambda運算元發展出來的另一個平行的語言世界。讓我們來看一看被人們一代一代吟唱著的神奇的Y Combinator…

關於Y Combinator的文章可謂數不勝數,這個由師從希爾伯特的著名邏輯學家Haskell B.Curry(Haskell語言就是以他命名的,而函數式編程語言裡面的Curry手法也是以他命名)「發明」出來的組合運算元(Haskell是研究組合邏輯(combinatory logic)的)彷彿有種神奇的魔力,它能夠算出給定lambda表達式(函數)的不動點。從而使得遞歸成為可能。事實上,我們待會就會看到,Y Combinator在神奇的表面之下,其實隱藏著深刻的意義,其背後體現的意義,曾經開出過歷史上最燦爛的數學之花,所以MIT的計算機科學系將它做成系徽也就不足為奇了[5]。

當然,要了解這個神奇的運算元,我們需要一點點lambda運算元理論的基礎知識,不過別擔心,lambda運算元理論是我目前見過的最簡潔的公理系統,這個系統僅僅由三條非常簡單的公理構成,而這三條公理裡面我們又只需要關注前兩條。

以下小節——lambda calculus——純粹是為了沒有接觸過lambda運算元理論的讀者准備的,並不屬於本文重點討論的東西,然而要討論Y combinator就必須先了解一下lambda(當然,以編程語言來了解也行,但是你會看到,丘齊最初提出的lambda運算元理論才是最最簡潔和漂亮的,學起來也最省事。)所以我單獨准備了一個小節來介紹它。如果你已經知道,可以跳過這一小節。不知道的讀者也可以跳過這一小節去wikipedia上面看,這里的介紹使用了wikipedia上的方式

lambda calculus
先來看一下lambda表達式的基本語法(BNF):

<expr> ::= <identifier>
<expr> ::= lambda <identifier-list>. <expr>
<expr> ::= (<expr> <expr>)

前兩條語法用於生成lambda表達式(lambda函數),如:

lambda x y. x + y

haskell裡面為了簡潔起見用「\」來代替希臘字母lambda,它們形狀比較相似。故而上面的定義也可以寫成:
\ x y. x + y

這是一個匿名的加法函數,它接受兩個參數,返回兩值相加的結果。當然,這里我們為了方便起見賦予了lambda函數直觀的計算意義,而實際上lambda calculus裡面一切都只不過是文本替換,有點像C語言的宏。並且這里的「+」我們假設已經是一個具有原子語義的運算符[6],此外,為了方便我們使用了中綴表達(按照lambda calculus系統的語法實際上應該寫成「(+ x y)」才對——參考第三條語法)。

那麼,函數定義出來了,怎麼使用呢?最後一條規則就是用來調用一個lambda函數的:

((lambda x y. x + y) 2 3)

以上這一行就是把剛才定義的加法函數運用到2和3上(這個調用語法形式跟命令式語言(imperative language)慣用的調用形式有點區別,後者是「f(x, y)」,而這里是「(f x y)」,不過好在順序沒變:) )。為了表達簡潔一點,我們可以給(lambda x y. x + y)起一個名字,像這樣:

let Add = (lambda x y. x + y)

這樣我們便可以使用Add來表示該lambda函數了:

(Add 2 3)

不過還是為了方便起見,後面調用的時候一般用「Add(2, 3)」,即我們熟悉的形式。

有了語法規則之後,我們便可以看一看這個語言系統的兩條簡單至極的公理了:

Alpha轉換公理:例如,「lambda x y. x + y」轉換為「lambda a b. a + b」。換句話說,函數的參數起什麼名字沒有關系,可以隨意替換,只要函數體裡面對參數的使用的地方也同時注意相應替換掉就是了。
Beta轉換公理:例如,「(lambda x y. x + y) 2 3」轉換為「2 + 3」。這個就更簡單了,也就是說,當把一個lambda函數用到參數身上時,只需用實際的參數來替換掉其函數體中的相應變數即可。

就這些。是不是感覺有點太簡單了?但事實就是如此,lambda運算元系統從根本上其實就這些東西,然而你卻能夠從這幾個簡單的規則中推演出神奇無比的Y combinator來。我們這就開始!

遞歸的迷思
敏銳的你可能會發現,就以上這兩條公理,我們的lambda語言中無法表示遞歸函數,為什麼呢?假設我們要計算經典的階乘,遞歸描述肯定像這樣:

f(n):
if n == 0 return 1
return n*f(n-1)

當然,上面這個程序是假定n為正整數。這個程序顯示了一個特點,f在定義的過程中用到了它自身。那麼如何在lambda運算元系統中表達這一函數呢?理所當然的想法如下:

lambda n. If_Else n==0 1 n*<self>(n-1)

當然,上面的程序假定了If_Else是一個已經定義好的三元操作符(你可以想像C的「?:」操作符,後面跟的三個參數分別是判斷條件、成功後求值的表達式、失敗後求值的表達式。那麼很顯然,這個定義裡面有一個地方沒法解決,那就是<self>那個地方我們應該填入什麼呢?很顯然,熟悉C這類命令式語言的人都知道應該填入這個函數本身的名字,然而lambda運算元系統裡面的lambda表達式(或稱函數)是沒有名字的。

怎麼辦?難道就沒有辦法實現遞歸了?或者說,丘齊做出的這個lambda運算元系統裡面根本沒法實現遞歸從而在計算能力上面有重大的缺陷?顯然不是。馬上你就會看到Y combinator是如何把一個看上去非遞歸的lambda表達式像變魔術那樣變成一個遞歸版本的。在成功之前我們再失敗一次,注意下面的嘗試:

let F = lambda n. IF_Else n==0 1 n*F(n-1)

看上去不錯,是嗎?可惜還是不行。因為let F只是起到一個語法糖的作用,在它所代表的lambda表達式還沒有完全定義出來之前你是不可以使用F這個名字的。更何況實際上丘齊當初的lambda運算元系統裡面也並沒有這個語法元素,這只是剛才為了簡化代碼而引入的語法糖。當然,了解這個let語句還是有意義的,後面還會用到。

一次成功的嘗試
在上面幾次失敗的嘗試之後,我們是不是就一籌莫展了呢?別忘了軟體工程裡面的一條黃金定律:「任何問題都可以通過增加一個間接層來解決」。不妨把它沿用到我們面臨的遞歸問題上:沒錯,我們的確沒辦法在一個lambda函數的定義裡面直接(按名字)來調用其自身。但是,可不可以間接調用呢?

我們回顧一下剛才不成功的定義:

lambda n. If_Else n==0 1 n*<self>(n-1)

現在<self>處不是缺少「這個函數自身」嘛,既然不能直接填入「這個函數自身」,我們可以增加一個參數,也就是說,把<self>參數化:

lambda self n. If_Else n==0 1 n*self(n-1)

上面這個lambda運算元總是合法定義了吧。現在,我們調用這個函數的時候,只要加傳一個參數self,這個參數不是別人,正是這個函數自身。還是為了簡單起見,我們用let語句來給上面這個函數起個別名:

let P = lambda self n. If_Else n==0 1 n*self(n-1)

我們這樣調用,比如說我們要計算3的階乘:

P(P, 3)

也就是說,把P自己作為P的第一個參數(注意,調用的時候P已經定義完畢了,所以我們當然可以使用它的名字了)。這樣一來,P裡面的self處不就等於是P本身了嗎?自身調用自身,遞歸!

可惜這只是個美好的設想,還差一點點。我們分析一下P(P, 3)這個調用。利用前面講的Beta轉換規則,這個函數調用展開其實就是(你可以完全把P當成一個宏來進行展開!):

IF_Else n==0 1 n*P(n-1)

看出問題了嗎?這里的P(n-1)雖然調用到了P,然而只給出了一個參數;而從P的定義來看,它是需要兩個參數的(分別為self和n)!也就是說,為了讓P(n-1)變成良好的調用,我們得加一個參數才行,所以我們得稍微修改一下P的定義:

let P = lambda self n. If_Else n==0 1 n*self(self, n-1)

請注意,我們在P的函數體內調用self的時候增加了一個參數。現在當我們調用P(P, 3)的時候,展開就變成了:

IF_Else 3==0 1 3*P(P, 3-1)

而P(P, 3-1)是對P合法的遞歸調用。這次我們真的成功了!

不動點原理
然而,看看我們的P的定義,是不是很醜陋?「n*self(self, n-1)」?什麼玩意?為什麼要多出一個多餘的self?DRY!怎麼辦呢?我們想起我們一開始定義的那個失敗的P,雖然行不通,但最初的努力往往是大腦最先想到的最直觀的做法,我們來回顧一下:

let P = lambda self n. If_Else n==0 1 n*self(n-1)

這個P的函數體就非常清晰,沒有冗餘成分,雖然參數列表裡面多出一個self,但我們其實根本不用管它,看函數體就行了,self這個名字已經可以說明一切了對不對?但很可惜這個函數不能用。我們再來回想一下為什麼不能用呢?因為當你調用P(P, n)的時候,裡面的self(n-1)會展開為P(n-1)而P是需要兩個參數的。唉,要是這里的self是一個「真正」的,只需要一個參數的遞歸階乘函數,那該多好啊。為什麼不呢?乾脆我們假設出一個「真正」的遞歸階乘函數:

power(n):
if(n==0) return 1;
return n*power(n-1);

但是,前面不是說過了,這個理想的版本無法在lambda運算元系統中定義出來嗎(由於lambda函數都是沒名字的,無法自己內部調用自己)?不急,我們並不需要它被定義出來,我們只需要在頭腦中「假設」它以「某種」方式被定義出來了,現在我們把這個真正完美的power傳給P,這樣:

P(power, 3)

注意它跟P(P, 3)的不同,P(P, 3)我們傳遞的是一個有缺陷的P為參數。而P(power, 3)我們則是傳遞的一個真正的遞歸函數power。我們試著展開P(power, 3):

IF_Else 3==0 1 3*power(3-1)

發生了什麼??power(3-1)將會計算出2的階乘(別忘了,power是我們設想的完美遞歸函數),所以這個式子將會忠實地計算出3的階乘!

回想一下我們是怎麼完成這項任務的:我們設想了一個以某種方式構造出來的完美的能夠內部自己調用自己的遞歸階乘函數power,我們發現把這個power傳給P的話,P(power, n)的展開式就是真正的遞歸計算n階乘的代碼了。