递归的理解

Posted havihouston

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归的理解相关的知识,希望对你有一定的参考价值。

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

 

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

 

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

 

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

以上是关于递归的理解的主要内容,如果未能解决你的问题,请参考以下文章

Java基础之方法的调用重载以及简单的递归

JavaScript - 代码片段,Snippets,Gist

金蝶handler中 collection 代码片段理解

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

如何理解这段代码片段中的两对括号?

executePendingTransactions 的递归入口