看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《povertytrap (povertytrap)》之銘言: : 各位大大好 小弟是第一次在C版發文 : 因為我有修資料結構 而我們老師有出個題目 是說用副程式寫出C的排列組合 : 意思是C的(m,n) m在上n在下會等於 m階/{n階*(m-n)階} 然後要用副程式寫 : #include <stdio.h> : #include <stdlib.h> : long int factor(int p); /* 函式宣告*/ : long int factor(int p) /* 函式定義*/ : { : ------------------------- : } : void main(void) : { : ------xxx= factor(int p) /* 呼叫函式*/ : } 因為說要階乘, factor 函數就是要處理階乘 (如果名字要寫對,應該寫 factorial, 階乘). 可是你以下的寫法...是抄同學的,那就不可以說是你的寫法. : 而我的寫法是 : #include <stdio.h> : #include <stdlib.h> : int factor(a,b) : { : a=1,b; : while(a>=1) : { : b*=a; : a--; : } : return b; : } m! / (n! * (m-n)!) ===> factor(m) / (factor(n) * factor(m-n)) 這種對應應該看得懂吧?? 那就可以想一下 factor 函數怎麼求階乘: 階乘就是 1 * 2 * 3 * ... * m. factor 只知道一個 m,意思就是從 1 連乘到 m. 所以,數學函數寫成: f(0) = 1 f(n) = f(n-1)*n, if n > 0 照寫成函數看看,二句分寫成二段: int factor(int n) { if (n == 0) return 1; } int factor(int n) { if (n > 0) return factor(n-1) * n; } 先把二個同名函數分開看,每個自己看起來都對. 沒有不對的,是吧? 然後,我們把二個函數放在一起,就好像拉拉鏈一樣,二個對在一起: int factor(int n) { if (n == 0) return 1; if (n > 0) return factor(n-1) * n; // 前面二個對在一起. return 1; // 剩下 n < 0 的情況,要補上去,全部的階乘功能才完整. } 這樣就很簡單完成了. 不過,你最前面提到,你有修資料結構,而老師給的是這個,求組合數目. 能問一下,這是資料結構的哪一課嗎? 或者是在資料結構之後的高等程式設計課程? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.160.208.137
stupid0319:所謂的"高等"是?? 10/01 02:05
tinlans:他說的「有修資料結構」不是完成式,是現在式吧。 10/01 02:51
tinlans:這東西是 Horowitz 那本聖經本第一章就會有的基本問題。 10/01 02:53
tinlans:Fundamentals of data structures in C 10/01 02:53
yauhh:蠻久以前,大學的課程會分初級程設與高等程設,以目前來看, 10/01 09:29
yauhh:就是在資料結構課之後的任何語言的程式設計吧..隨便問問而已 10/01 09:30
yauhh:FDS這本書,給我較深的印象是用ADT說明陣列是什麼. 10/01 09:31
povertytrap:我只知道我們現在學得應該是C++ 10/01 20:27
VictorTom:這篇y大寫的是數學概念->實作方法, 裡面也沒有用到什麼 10/01 23:56
VictorTom:C或C++特有的東西, 用的是語言基本元素加上所謂遞迴的 10/01 23:56
VictorTom:實作方式完成那個f function的@_@" 10/01 23:57
yauhh:對嘛,感覺不像是資料結構會講的作業,應該是學C++就可以做了. 10/02 10:23
yauhh:f function! 哦,把factor筆誤為f了... 10/02 10:24
※ 編輯: yauhh 來自: 218.160.208.1 (10/02 10:25)