• 递归的理解


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

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

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

    假设有两个数 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("--------------辗转相减法过程--------------
    ");  
    while(tempa != 0){  
    if(tempa < tempb){tempc = tempa;tempa = tempb;tempb = tempc;}  
    tempc = tempa - tempb;  
    printf("tempa = %d; tempb = %d; tempc = %d
    " , 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("--------------辗转相除法过程--------------
    ");  
    /*while(tempa != 0){ 
    if(tempa < tempb){tempc = tempa;tempa = tempb;tempb = tempc;} 
    tempc = tempa % tempb; 
    printf("tempa = %d; tempb = %d; tempc = %d
    " , tempa , tempb , tempc); 
    tempa = tempc; 
    }*/  
    while(tempb != 0){  
    tempc = tempa % tempb;  
    printf("tempa = %d; tempb = %d; tempc = %d
    " , 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
    " , 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
    " , data1);  
    data2 = max_yinshu2(a , b);  
    printf("最大公因数为 :%d
    " , data2);  
    printf("--------------递归过程--------------
    ");  
    data3 = max_yinshu3(a , b);  
    printf("最大公因数为(递归法) :%d
    " , 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("--------------辗转相减法过程-------------- ");  
    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 " , 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("--------------辗转相除法过程-------------- ");  
    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 " , tempa , tempb , tempc); 
    28. tempa = tempc; 
    29. }*/  
    30. while(tempb != 0){  
    31. tempc = tempa % tempb;  
    32. printf("tempa = %d; tempb = %d; tempc = %d " , 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 est4_max_yinshumax_yinshu.cmax_yinshu.cmax_yinshu.c.cpp 2  
    41. else{  
    42. printf("tempa = %d; tempb = %d; tempc = %d " , 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 " , data1);  
    56. data2 = max_yinshu2(a , b);  
    57. printf("最大公因数为 :%d " , data2);  
    58. printf("--------------递归过程-------------- ");  
    59. data3 = max_yinshu3(a , b);  
    60. printf("最大公因数为(递归法) :%d " , data3);  
    61. }  
    62. return 0;  
    63. }  
  • 相关阅读:
    洛谷 P3366 【模板】最小生成树
    洛谷 P2820 局域网
    一本通【例4-10】最优布线问题
    洛谷 P1546 最短网络 Agri-Net
    图论模板
    洛谷 AT667 【天下一人力比較】
    刷题记录
    洛谷P1553 数字翻转(升级版)
    tornado硬件管理系统-网络与磁盘的实现(7)
    tornado硬件管理系统-内存与swap的实现(6)
  • 原文地址:https://www.cnblogs.com/havihouston/p/6165243.html
Copyright © 2020-2023  润新知