首页 > 代码库 > 递归的理解

递归的理解

理解递归的最重要的一点是不要去纠结递归函数中的一些细节到地是怎么实现的,这个例子在上一篇的汉诺塔问题中的到了充分的体现。

 

本篇文章只要是实现最大公倍数的递归实现方法。

 

最大公倍数是指两个数能够被一组数同时整除,其中最大的那个数就叫做最大公倍数,求解最大公倍数这里主要说两个想法,其实就是将复杂的问题简化逐步简化到一个很小的问题,然后求得答案。

 

假设有两个数 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;
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;  
}  

技术分享

  1. #include "stdafx.h"  
  2. //辗转相减法  
  3. int max_yinshu1(int a , int b){  
  4. int temp = 1;  
  5. int tempa = a;  
  6. int tempb = b;  
  7. int tempc = 0;  
  8. printf("--------------辗转相减法过程--------------\n");  
  9. while(tempa != 0){  
  10. if(tempa < tempb){tempc = tempa;tempa = tempb;tempb = tempc;}  
  11. tempc = tempa - tempb;  
  12. printf("tempa = %d; tempb = %d; tempc = %d\n" , tempa , tempb , tempc);  
  13. tempa = tempc;  
  14. }  
  15. return tempb;  
  16. }  
  17. //辗转相除法  
  18. int max_yinshu2(int a , int b){  
  19. int temp = 1;  
  20. int tempa = a;  
  21. int tempb = b;  
  22. int tempc = 0;  
  23. printf("--------------辗转相除法过程--------------\n");  
  24. /*while(tempa != 0){ 
  25. if(tempa < tempb){tempc = tempa;tempa = tempb;tempb = tempc;} 
  26. tempc = tempa % tempb; 
  27. printf("tempa = %d; tempb = %d; tempc = %d\n" , tempa , tempb , tempc); 
  28. tempa = tempc; 
  29. }*/  
  30. while(tempb != 0){  
  31. tempc = tempa % tempb;  
  32. printf("tempa = %d; tempb = %d; tempc = %d\n" , tempa , tempb , tempc);  
  33. tempa = tempb;  
  34. tempb = tempc;  
  35. }  
  36. return tempa;  
  37. }  
  38. //递归法  
  39. int max_yinshu3(int a , int b){  
  40. if(a%b == 0) return b;E:\c_file\test4_max_yinshu\max_yinshu.c\max_yinshu.c\max_yinshu.c.cpp 2  
  41. else{  
  42. printf("tempa = %d; tempb = %d; tempc = %d\n" , a , b , a%b);  
  43. return max_yinshu3(b , a%b);  
  44. }  
  45. }  
  46. int _tmain(int argc, _TCHAR* argv[])  
  47. {  
  48. int a = 0;  
  49. int b = 0;  
  50. int data1 = 0;  
  51. int data2 = 0;  
  52. int data3 = 0;  
  53. while(scanf("%d%d" , &a , &b)){  
  54. data1 = max_yinshu1(a , b);  
  55. printf("最大公因数为 :%d\n" , data1);  
  56. data2 = max_yinshu2(a , b);  
  57. printf("最大公因数为 :%d\n" , data2);  
  58. printf("--------------递归过程--------------\n");  
  59. data3 = max_yinshu3(a , b);  
  60. printf("最大公因数为(递归法) :%d\n" , data3);  
  61. }  
  62. return 0;  
  63. }  

递归的理解