理解遞歸的最重要的一點是不要去糾結遞歸函數中的一些細節到地是怎麼實現的,這個例子在上一篇的漢諾塔問題中的到了充分的體現。
本篇文章只要是實現最大公倍數的遞歸實現方法。
最大公倍數是指兩個數能夠被一組數同時整除,其中最大的那個數就叫做最大公倍數,求解最大公倍數這裏主要說兩個想法,其實就是將複雜的問題簡化逐步簡化到一個很小的問題,然後求得答案。
假設有兩個數 252和105
252 : 21*12
105 : 21 * 5
252 - 105 = 147 = 21 * 7
兩個數相減後他的最大公倍數是不變的,所以,可以用這種方法一直遞減來實現算法
除法和遞減的性質其實是一樣的
#include "stdafx.h"
//輾轉相減法
int max_yinshu1(int a , int b){
int temp = 1;
int tempa = a;
int tempb = b;
int tempc = 0;
printf("--------------輾轉相減法過程--------------\n");
while(tempa != 0){
if(tempa < tempb){tempc = tempa;tempa = tempb;tempb = tempc;}
tempc = tempa - tempb;
printf("tempa = %d; tempb = %d; tempc = %d\n" , tempa , tempb , tempc);
tempa = tempc;
}
return tempb;
}
//輾轉相除法
int max_yinshu2(int a , int b){
int temp = 1;
int tempa = a;
int tempb = b;
int tempc = 0;
printf("--------------輾轉相除法過程--------------\n");
/*while(tempa != 0){
if(tempa < tempb){tempc = tempa;tempa = tempb;tempb = tempc;}
tempc = tempa % tempb;
printf("tempa = %d; tempb = %d; tempc = %d\n" , tempa , tempb , tempc);
tempa = tempc;
}*/
while(tempb != 0){
tempc = tempa % tempb;
printf("tempa = %d; tempb = %d; tempc = %d\n" , tempa , tempb , tempc);
tempa = tempb;
tempb = tempc;
}
return tempa;
}
//遞歸法
int max_yinshu3(int a , int b){
if(a%b == 0) return b;E:\c_file\test4_max_yinshu\max_yinshu.c\max_yinshu.c\max_yinshu.c.cpp 2
else{
printf("tempa = %d; tempb = %d; tempc = %d\n" , a , b , a%b);
return max_yinshu3(b , a%b);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
int b = 0;
int data1 = 0;
int data2 = 0;
int data3 = 0;
while(scanf("%d%d" , &a , &b)){
data1 = max_yinshu1(a , b);
printf("最大公因數爲 :%d\n" , data1);
data2 = max_yinshu2(a , b);
printf("最大公因數爲 :%d\n" , data2);
printf("--------------遞歸過程--------------\n");
data3 = max_yinshu3(a , b);
printf("最大公因數爲(遞歸法) :%d\n" , data3);
}
return 0;
}
結果如下所示 :