鹏哥C语言62---第9次作业:函数递归训练

打印 上一主题 下一主题

主题 1881|帖子 1881|积分 5643

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//-------------------------------------------------------------------------------------------第九次作业  函数递归等
//-------------------------------------------------------------------------------单选1
关于递归的形貌错误的是C)
A.存在限制条件,当满足这个限制条件的时候,递归便不再继承
B.每次递归调用之后越来越接近这个限制条件
C.递归可以无限递归下去
D.递归层次太深,会出现栈溢出现象
//-------------------------------------------------------------------------------单选2
根据下面递归函数:调用函数Fun(2),返回值是多少(D)
  1. int Fun(int n)
  2. {
  3.     if(n == 5)
  4.              return 2;
  5.    else
  6.              return 2*Fun(n+1);
  7. }
复制代码
A.2
B.4
C.8
D.16
*///-------------------------------------------------------------------------------编程题3:打印整数每一位
//递归方式实现打印整数的每一位 比方 1234 打印 1 2 3 4
//123 4
//12 34
//1 2 3 4
  1. void Print(unsigned int n) //1234
  2. {
  3.     if (n > 9)
  4.     {
  5.         Print(n / 10);
  6.     }
  7.     printf("%d ", n%10);
  8. }
  9. int main()
  10. {
  11.     unsigned int num = 0;
  12.     scanf("%u", &num); // 1234
  13.     Print(num);
  14.   
  15.     return 0;
  16. }
复制代码
//-------------------------------------------------------------------------------编程题4:求 n 的阶乘
//递归和非递归,分别实现求n的阶乘(不考虑溢出题目)
//-----------------------------------------------------------------4.1 循环求阶乘n
  1. int main()
  2. {
  3.     int n = 0;
  4.     scanf("%d", &n);
  5.     int i = 0;
  6.     int num = 1;
  7.     for (i = 1; i <= n; i++)
  8.     {
  9.         num = num * i;
  10.     }
  11.     printf("%d\n", num);
  12.     return 0;
  13. }
复制代码
//-----------------------------------------------------------------4.2 递归求阶乘n
//5!=1*2*3*4*5
//5!=4!*5
//4!=3!*4
//3!=2!*3
//2!=1!*2
//1!=1
  1. int factorial(int n) //5
  2. {
  3.     if (n > 0)
  4.         return factorial(n - 1) * n;
  5.     else
  6.         return 1;
  7. }
  8. int main()
  9. {
  10.     int n = 0;
  11.     scanf("%d", &n);
  12.     int ret = factorial(n);
  13.     printf("%d\n", ret);
  14.     return 0;
  15. }
复制代码
//-------------------------------------------------------------------------------编程题5:strlen的模拟
//递归和非递归分别实现strlen
//----------------------------------------------------------------5.1 循环求strlen
  1. int my_strlen(char arr[])
  2. {
  3.     int i = 0;
  4.     int count = 0;
  5.     while (arr[i] != '\0')
  6.     {
  7.         count++;
  8.         i++;
  9.     }
  10.     return count;
  11. }
  12. int main()
  13. {
  14.     char arr[] = "abcdef"; // [a b c \0]
  15.     int len = my_strlen(arr); // 函数传参时,传的是首字符 a 的地址
  16.     printf("%d\n", len);
  17.     return 0;
  18. }
复制代码
//-----------------------------------------------------------------5.2 递归求strlen
//my_strlen("abc");
//1+my_strlen("bc");
//1+1+my_strlen("c");
//1+1+1+my_strlen("\0");
//1+1+1+0
  1. int my_strlen(char* arr)
  2. {
  3.     if (*arr != '\0')
  4.         return 1 + my_strlen(arr + 1);
  5.     else
  6.         return 0;
  7. }
  8. int main()
  9. {
  10.     char arr[] = "abcdefgh"; // [a b c d e f g h\0]
  11.     int len = my_strlen(arr); // 函数传参时,传的是首字符 a 的地址
  12.     printf("%d\n", len);
  13.     return 0;
  14. }
复制代码
//-------------------------------------------------------------------------------编程题6:字符串逆序(递归实现)
//编写一个字符串 reverse_string(char* string)
//将参数字符串中的字符反向分列,不是逆序打印
//不能使用V函数库中的字符串操纵符 
// 比方: char arr[]="abcdef";
//   逆序之后数组里的内容变成  fedcba//--------------------------------------------------------------6.1 用循环求逆序
  1. int main()
  2. {
  3.     char arr[] = "abcdef";
  4.     int sz = sizeof(arr) / sizeof(arr[0]); //把 \0 也计算进去了,算出来7/1=7
  5.     int left = 0;
  6.     int right = sz - 2; //所以 sz-2
  7.     // int right=strlen(arr)-1;  //用strlen 求字符串长度 6
  8.     while (left < right)
  9.     {
  10.         char tmp = arr[left];
  11.         arr[left] = arr[right];
  12.         arr[right] = tmp;
  13.         left++;
  14.         right--;
  15.     }
  16.     printf("%s\n", arr);
  17.     return;
  18. }
复制代码
//---------------------------------------------------------------6.2 用函数求逆序
  1. void reverse(char arr[])
  2. {
  3.     int left = 0;
  4.     int right = strlen(arr) - 1;  //用strlen 求字符串长度 6
  5.     while (left < right)
  6.     {
  7.         char tmp = arr[left];
  8.         arr[left] = arr[right];
  9.         arr[right] = tmp;
  10.         left++;
  11.         right--;
  12.     }
  13. }
  14. int main()
  15. {
  16.     char arr[] = "abcdef";
  17.     reverse(arr);
  18.     printf("%s\n", arr);
  19.     return;
  20. }
复制代码
//------------------------------------------------------------------6.3 用递归求逆序
  1. int my_strlen(char* str)
  2. {
  3.     int count=0;
  4.     while (*str != '\0')
  5.     {
  6.         count++;
  7.         str++;
  8.     }
  9.     return count;
  10. }
  11. void reverse(char* str)
  12. {
  13.     char tmp = *str; //1
  14.     int len = my_strlen(str);// 不用库函数,自己定义一个函数
  15.     *str = *(str + len - 1); //2
  16.     *(str + len - 1) = '\0'; //3
  17.    if(strlen(str+1)>=2) //(递归的条件)
  18.              reverse(str + 1); //4
  19.     *(str + len - 1) = tmp; //5
  20. }
  21. int main()
  22. {
  23.     char arr[] = "abcdef";
  24.     reverse(arr);
  25.     printf("%s\n", arr);
  26.     return;
  27. }
复制代码
//------------------------------------------------------------------6.4 用递归求逆序plus
  1. int my_strlen(char* str)
  2. {
  3.     int count=0;
  4.     while (*str != '\0')
  5.     {
  6.         count++;
  7.         str++;
  8.     }
  9.     return count;
  10. }
  11. void reverse(char arr[], int left, int right)
  12. {
  13.     if(left<right)//-------------------必须加这个条件
  14.     {
  15.         char tmp = arr[left];
  16.         arr[left] = arr[right];
  17.         arr[right] = tmp;
  18.         if (left < right)
  19.             reverse(arr, left + 1, right - 1);
  20.     }
  21.    
  22. }
  23. int main()
  24. {
  25.     char arr[] = "abcdefg";
  26.     int left = 0;
  27.     int right = my_strlen(arr) - 1;
  28.     reverse(arr,left,right);
  29.     printf("%s\n", arr);
  30.     return 0;;
  31. }
复制代码
//---------------------------------------------------------------------------------编程题7:盘算一个数的每位之和
//写一个递归函数 DigitSum(n),输入一个非负整数,返回组成他的非负之和
//比方:调用 DigitSum(1729),应该返回1 7 2 9,和是19
//输入 1279  输出19
  1. int DigitSum(unsigned int n) //1729
  2. {
  3.     if (n > 0)
  4.         return DigitSum(n / 10) + n % 10;
  5.     else
  6.         return n;
  7. }
  8. int main()
  9. {
  10.     unsigned int n = 0;
  11.     scanf("%d", &n);
  12.     int ret = DigitSum(n);
  13.     printf("%d\n", ret);
  14.     return 0;
  15. }
复制代码
//-------------------------------------------------------------------------------编程题8:递归实现n的k次方
//编写一个函数实现 n 的k次方
  1. double Power(int n, int k)
  2. {
  3.     if (k > 0)
  4.         return n * Power(n, k - 1);
  5.     else if (k == 0)
  6.         return 1;
  7.     else
  8.         return 1.0 / Power(n, -k);
  9. }
  10. int main()
  11. {
  12.     int n = 0;
  13.     int k = 0;
  14.     scanf("%d %d", &n, &k);
  15.     double ret = Power(n, k);
  16.    printf("%lf\n", ret);
  17.     return 0;
  18. }
复制代码
//-------------------------------------------------------------------------------编程题9:盘算斐波那契数
//递归和非递归分别实现求第n 个斐波那契数
//求第 n 个斐波那契数(不考虑溢出)
// 1 1 2 3 5 8 13 21 34 55...
// 前两数相加等于第三个数
  1. int Fibonacci(int n)
  2. {
  3.     if (n < 3)
  4.         return 1;
  5.     if (n >= 3)
  6.     {
  7.         return Fibonacci(n - 1) + Fibonacci(n - 2);
  8.     }
  9. }
  10. int main()
  11. {
  12.     int n = 0;
  13.     scanf("%d", &n);
  14.     int ret = Fibonacci(n);
  15.     printf("%d\n", ret);
  16.     return 0;
  17. }
复制代码

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表