[問題] 請教ㄧ個遞迴求最大公因數

看板C_and_CPP (C/C++)作者 (無)時間16年前 (2009/03/22 22:22), 編輯推噓6(6013)
留言19則, 6人參與, 最新討論串1/1
#include <stdio.h> #include <stdlib.h> int gcd(int x,int y); int main() { int x,y; printf("請輸入兩個數字\n"); printf("X:"); scanf("%d",&x); printf("Y:"); scanf("%d",&y); printf("gcd:%d",gcd(x,y)); system("PAUSE"); return 0; } int gcd(int x,int y) { if(x!=0 && y!=0){ if(x>y) gcd(y,(x%y)); if(y>x) gcd(x,(y%x)); } else{ if(x==0) return y; else return x; } } 會什麼我最後print出來的值都是-1 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.169.183

03/22 22:35, , 1F
在電腦裡,-1是最大的數,這牽涉到補數的概念
03/22 22:35, 1F

03/22 22:37, , 2F
可是假如最後不return迴去main 直接print出來的值就正常
03/22 22:37, 2F

03/22 23:13, , 3F
你的遞迴有問題。
03/22 23:13, 3F

03/22 23:17, , 4F
可以點一下那裡出錯了嗎?
03/22 23:17, 4F

03/22 23:18, , 5F
我覺得前面兩個gcd也要加上return
03/22 23:18, 5F

03/22 23:22, , 6F
理論上不會編譯過 原因在樓上
03/22 23:22, 6F

03/22 23:23, , 7F
說一下你的compiler OS和測資
03/22 23:23, 7F

03/22 23:23, , 8F
我用dev-c++ 4.9.9.2 編譯可以過
03/22 23:23, 8F

03/22 23:30, , 9F
可以過,在函數裡面的兩個gcd前面加上return 答案就對了
03/22 23:30, 9F

03/22 23:30, , 10F
如tsaiminghan所說 加上return後正常了,請問一下加上
03/22 23:30, 10F

03/22 23:30, , 11F
不過究竟為什麼會出現-1...真奇妙
03/22 23:30, 11F

03/22 23:31, , 12F
請問有加return跟沒加差在哪裡?
03/22 23:31, 12F

03/22 23:33, , 13F
你想想看遞迴是怎麼運作的?你不加return 的話
03/22 23:33, 13F

03/22 23:34, , 14F
除了最後一層,其他層都沒有回傳值
03/22 23:34, 14F

03/22 23:34, , 15F
不過我也很好奇為什麼會回傳-1,難道是預設值?
03/22 23:34, 15F

03/22 23:35, , 16F
編譯器自已加的?
03/22 23:35, 16F

03/22 23:41, , 17F
我認為要看GNU compiler怎麼運作的
03/22 23:41, 17F

03/22 23:42, , 18F
因為理想上應該連compile都不能過才對
03/22 23:42, 18F

03/22 23:47, , 19F
一向都只會有 warning, 如果走到沒 return 的就是 未定義
03/22 23:47, 19F
文章代碼(AID): #19nacV-R (C_and_CPP)
文章代碼(AID): #19nacV-R (C_and_CPP)