作者yauhh (喲)
看板C_and_CPP
標題Re: [問題] 我的寫法 跑不出老師的答案
時間Fri Oct 1 01:47:16 2010
※ 引述《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)