Re: [問題] 我的寫法 跑不出老師的答案
※ 引述《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
推
10/01 02:05, , 1F
10/01 02:05, 1F
→
10/01 02:51, , 2F
10/01 02:51, 2F
→
10/01 02:53, , 3F
10/01 02:53, 3F
→
10/01 02:53, , 4F
10/01 02:53, 4F
→
10/01 09:29, , 5F
10/01 09:29, 5F
→
10/01 09:30, , 6F
10/01 09:30, 6F
→
10/01 09:31, , 7F
10/01 09:31, 7F
推
10/01 20:27, , 8F
10/01 20:27, 8F
推
10/01 23:56, , 9F
10/01 23:56, 9F
→
10/01 23:56, , 10F
10/01 23:56, 10F
→
10/01 23:57, , 11F
10/01 23:57, 11F
→
10/02 10:23, , 12F
10/02 10:23, 12F
→
10/02 10:24, , 13F
10/02 10:24, 13F
※ 編輯: yauhh 來自: 218.160.208.1 (10/02 10:25)
討論串 (同標題文章)