【C语言】递归练习题小结

     程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

    在学习C语言的时候,递归也作为一个重要的角色出现在我们的视野中。

     在递归的案例中,斐波那契数是一个很经典的例题,在前面已经为大家总结(C语言实现斐波那契数列点击打开链接)。在此也为大家附上其它的练习:


1、编写一个函数求n的阶乘:

[cpp]  view plain  copy
  1. //递归  
  2. #include<stdio.h>  
  3. #include<string.h>  
  4. #include<assert.h>  
  5. int fa(int n)  
  6. {  
  7.     if (n <= 1)  
  8.     {  
  9.         return 1;  
  10.     }  
  11.     else  
  12.     {  
  13.         return n*fa(n - 1);  
  14.     }  
  15. }  
  16.   
  17. int main()  
  18. {  
  19.     int n = 5;  
  20.     int ret = fa(n);  
  21.     printf("ret = %d\n", ret);  
  22.     system("pause");  
  23.     return 0;  
  24. }  



2、编写一个函数,可以分别打印一个整数十进制的每一位:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. //#include<assert.h>  
  4. void print(int n)  
  5. {  
  6.     if (n > 9)  
  7.     {  
  8.         print(n / 10);  
  9.     }  
  10.     printf("%d\n", n % 10);  
  11. }  
  12. int main()  
  13.   
  14. {     
  15.     print(1234);  
  16. system("pause");  
  17. return 0;  
  18.   
  19. }  



3、编写一个函数实现n^k,使用递归实现:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. int pow(int n, int k)  
  3. {  
  4.     if (k == 0)  
  5.     {  
  6.         return 1;  
  7.     }  
  8.     else if (k == 1)  
  9.     {  
  10.         return n;  
  11.     }  
  12.     else  
  13.     {  
  14.         return n*pow(n, k-1 );  
  15.     }  
  16.   
  17. }  
  18. int main()  
  19. {  
  20.     int n = 2;  
  21.     int k = 3;  
  22.     printf("%d\n", pow(n, k));  
  23.     system("pause");  
  24.     return 0;  
  25. }  



4、不允许创建临时变量求字符串长度,实现strlen的模拟:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. #include<assert.h>  
  3. int my_strlen_no(char const *p)  
  4. {  
  5.     assert(p != NULL);  
  6.     if (*p == NULL)  
  7.     {  
  8.         return 0;  
  9.     }  
  10.     else  
  11.     {  
  12.         return (1 + my_strlen_no(p + 1));  
  13.     }  
  14. }  
  15. int main()  
  16. {  
  17.     char *p = "abcdef";  
  18.     printf("长度是:%d\n", my_strlen_no(p));  
  19.     system("pause");  
  20.     return 0;  
  21. }  



5、编写一个函数reverse_string(char * string)(递归实现):

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. void reserve_string(char *string)  
  3. {  
  4.     if (*string == '\0')  
  5.         printf("%c", *string);  
  6.     else  
  7.     {  
  8.         reserve_string(++string);//输入下一个字符  
  9.         printf("%c", *(--string));  
  10.     }  
  11. }  
  12. int main()  
  13. {  
  14.     char s[] = "abcdef";  
  15.     reserve_string(s);  
  16.     system("pause");  
  17.     return 0;  
  18. }  



6、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和:

[cpp]  view plain  copy
  1. #include<stdio.h>  
  2. int dig(int n)  
  3. {  
  4.     if (n <= 10)  
  5.     {  
  6.         return 1;  
  7.     }  
  8.     else  
  9.     {  
  10.         return (n % 10 + dig(n / 10));  
  11.   
  12.     }  
  13. }  
  14. int main()  
  15. {  
  16.     printf("%d\n", dig(1729));  
  17.     system("pause");  
  18.     return 0;  
  19. }  
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值