[問題] 擴增歐幾里得演算法的遞迴版本

看板C_and_CPP (C/C++)作者 (哈哈)時間14年前 (2012/06/03 19:46), 編輯推噓4(4033)
留言37則, 4人參與, 最新討論串1/1
這個程式碼是用原本的歐幾里得演算法改的(為了記錄x和y) 用迴圈來寫我看得懂,可是用遞迴來寫我就有點看不懂了 我不懂的地方是 *x 和 *y 的傳遞為何是這樣? 可以麻煩解釋一下黃色那兩行的意義嗎? int ex_gcd(int a, int b, int *x, int *y){ int x1, y1, g; if(b>a) return ex_gcd(b, a, y, x); if(b==0){ *x = 1; *y = 0; return a; } g = ex_gcd(b, a%b, &x1, &y1); *x = y1; *y = (x1-a/b*y1); return g; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.199.129

06/04 01:04, , 1F
就是取商數取餘數而已
06/04 01:04, 1F

06/04 08:36, , 2F
不懂意思耶...可以解釋的清楚一點嗎?
06/04 08:36, 2F

06/04 08:39, , 3F
取誰的商數誰的餘數? 那兩數字不是a和b的係數嗎?
06/04 08:39, 3F

06/04 09:30, , 4F
你把 a%b 代入 a - b * (a/b) 去算一次就知道了
06/04 09:30, 4F

06/04 09:31, , 5F
這就是一樓所說的取商取餘的意思
06/04 09:31, 5F

06/04 09:36, , 6F
請問a%b是代入哪一個數? a還是b?
06/04 09:36, 6F

06/04 09:43, , 7F
...我好像講反了 a - b * (a/b) 代入 a%b 才對
06/04 09:43, 7F

06/04 09:44, , 8F
代入的式子是 g = b * x1 + (a%b) * y1
06/04 09:44, 8F

06/04 09:44, , 9F
如果你問這條式子怎麼來的請再看一次程式
06/04 09:44, 9F

06/04 09:55, , 10F
謝謝L大的說明! 代入式子後我就了解了!! 卡了兩天終於懂了~
06/04 09:55, 10F

06/04 10:08, , 11F
一個本來是那樣的東西,還要多講清楚真浪費時間, 基本上你知
06/04 10:08, 11F

06/04 10:10, , 12F
知道它是歐氏演算法,數學式拿出來對應就要抓得到線索.
06/04 10:10, 12F

06/04 11:29, , 13F
我知道他是歐式演算法,但我就是不了解他的程式為何這樣寫
06/04 11:29, 13F

06/04 11:30, , 14F
我知道一定有盲點我沒看出來,L大剛好點出我的盲點
06/04 11:30, 14F

06/04 11:31, , 15F
我不像你那麼厲害一看就看出,很抱歉浪費你寶貴的時間
06/04 11:31, 15F

06/04 12:19, , 16F
其實既然你看得懂迴圈版 你可以試著從迴圈版裡抓線索
06/04 12:19, 16F

06/04 12:19, , 17F
我推的這條數學式即使是迴圈版也不會改變
06/04 12:19, 17F

06/04 12:20, , 18F
這才是 yauhh 說「你應該要抓得到線索」的原因
06/04 12:20, 18F

06/04 12:35, , 19F
L你誤會了,那條式子我本來就知道,只是卡在我沒有把a%b和
06/04 12:35, 19F

06/04 12:36, , 20F
他想在一起,所以沒有做代入的動作去驗證,早上我將之代入
06/04 12:36, 20F

06/04 12:37, , 21F
整理過後就找到a和b的關係了! 另外迴圈版本其實沒寫出這式
06/04 12:37, 21F

06/04 12:38, , 22F
子! 而且我覺得這好像不是商數餘數的問題,單純是代入求解
06/04 12:38, 22F

06/04 12:40, , 23F
將b * x1 和 ( a - b * (a/b) ) * y1整理後得到的關係式
06/04 12:40, 23F

06/04 12:40, , 24F
可能是我資質駑鈍無法把這和商數餘數做關聯吧~
06/04 12:40, 24F

06/04 12:45, , 25F
那就是你的數學問題了...a/b 是商 所以餘數就是 a-b*(a/b)
06/04 12:45, 25F

06/04 12:46, , 26F
這個是小學算術的樣子...這也是為什麼一開始是回你取商取餘
06/04 12:46, 26F

06/04 12:58, , 27F
被除數=除數*商+餘數
06/04 12:58, 27F

06/04 12:58, , 28F
商=被除數/除數
06/04 12:58, 28F

06/04 12:59, , 29F
被除數=除數*(被除數/除數)+餘數
06/04 12:59, 29F

06/04 13:00, , 30F
餘數=被除數-除數*(被除數/除數)
06/04 13:00, 30F

06/04 13:00, , 31F
要取餘數,怎麼不直接用%就好?
06/04 13:00, 31F

06/04 13:08, , 32F
商數和餘數怎麼算我很清楚... 我會來問是不懂兩著的關聯性
06/04 13:08, 32F

06/04 13:09, , 33F
b * x1 和 ( a - b * (a/b) ) * y1 是推倒出來的,並不是
06/04 13:09, 33F

06/04 13:11, , 34F
這並不是誰的商誰的餘阿... 反正懂就好了...我也不知道怎
06/04 13:11, 34F

06/04 13:11, , 35F
麼解釋我弄不懂的地方...
06/04 13:11, 35F

06/04 13:14, , 36F
diablo! 因為他其實不是要求餘數,他是要a和b的係數
06/04 13:14, 36F

06/04 15:16, , 37F
抱歉,可能我搞錯意思了…
06/04 15:16, 37F
文章代碼(AID): #1FoqweDt (C_and_CPP)
文章代碼(AID): #1FoqweDt (C_and_CPP)