写点什么

函数递归习题 (easy 版)

作者:芒果酱
  • 2022 年 7 月 19 日
  • 本文字数:1735 字

    阅读完需:约 6 分钟

5.用非递归的方式模拟实现 strlen 函数

strlen:计算字符串长度的库函数,需要引用 string.h 头文件。遇到\0 停止计数。


strlen 和 sizeof 是一对有点相似的东西,具体的大家可以去看看我之前的文章.关于 strlen 和 sizeof 区别的文章链接:C语言-strlen与sizeof区别


//非递归方式int my_strlen1(char* s){  int count = 0;  //循环判断 不能用if  while (*s != '\0')  {    s++;    count++;  }  return count;
复制代码



6.用递归的方式模拟实现 strlen 函数

图解




//递归的方式int my_strlen2(char* s){  if (*s != '\0')    return 1 + my_strlen2(s + 1);  else    return 0;}int main(){  char arr[] = "Mango";  int ret1 = strlen(arr);  int ret2 = my_strlen1(arr);  int ret3 = my_strlen2(arr);  printf("%d %d %d", ret1, ret2, ret3);  return 0;}
复制代码




7.用非递归实现字符串逆序

方法:使用双指针,一个指向左边,一个指向右边。左指针指向的字符和右指针指向的字符交换。  循环条件为:left < right




//非递归方式void reverse(char* arr){  int len = strlen(arr);    //strlen接受的参数是地址,所以写成s    //解引用传过去的是char类型的数据,二者不匹配  char* right = arr + len - 1;  char* left = arr;  //注意此处不能赋值为0 相当于NULL  while (left < right)  {    char tmp = 0;    tmp = *left;    *left = *right;    *right = tmp;    left++;    right--;  }}int main(){  char arr[] = "ognam";  reverse(arr);  for (int i = 0; i < 5; i++)  {    printf("%c", arr[i]);  }  return 0;}
复制代码


运行结果:




8.用递归实现字符串逆序

图解


当大家遇到看不懂得递归,也可以像我一样,假设一个例子,然后用展开图来理解一下!

//递归方式  void reverse_string(char* arr){  int len = strlen(arr);  char tmp = *arr;  *arr = *(arr + len - 1);   *(arr + len - 1) = '\0';  if (strlen(arr + 1) >= 2)    reverse_string(arr + 1);   *(arr + len - 1) = tmp;}int main(){  char arr[] = "ognam";  reverse_string(arr);  for (int i = 0; i < 5; i++)  {    printf("%c", arr[i]);  }  return 0;}
复制代码


9.用递归计算一个数拆分成每一位之后的每位之和

图解





int DigitSum(int n){  if (n)    return n % 10 + DigitSum(n / 10);  else    return 0;}int main(){  int n = 0;  scanf("%d", &n);  int sum = DigitSum(n);  printf("%d", sum);  return 0;}
复制代码

运行结果:


10.用递归实现计算 n 的 k 次方

图解





int my_pow(int n, int k){  //一个数的0次方=1  if (k == 0)  {    return 1;  }  else if (k >= 1)    return my_pow(n, k - 1)*n;}int main(){  int n = 0;  int k = 0;  scanf("%d %d", &n, &k);  int ret1 = pow(n, k);   int ret2 = my_pow(n, k);  printf("%d  %d", ret1, ret2);}
复制代码



运行结果:


11.用非递归求第 n 个斐波那契数

图解





//8.求第n个斐波那契数//递归方式//方式1:int Fic(int n){  return n <= 2 ? 1 : Fic(n - 1) + Fic(n - 2);}int main(){  int n = 0;  scanf("%d", &n);  int ret = Fic(n);  printf("%d", ret);  return 0;}
复制代码


此种写法需要计算很多重复的数,效率低!




方法 2:迭代计算





//方式2int Fic(int n){  //思路:a, b, c  算出a + b的值放到c,   下一次:将b的值给a,将c的值给b  循环计算  //从第3个斐波那契数开始算,计算1次,计算第4个斐波那契数要计算2次  //- - 》》所以计算第n个要计算n - 2次  int a = 1;//第1个斐波那契数  int b = 1;//第2个斐波那契数  int c = 0;  while (n > 2)  {    c = a + b;    a = b;    b = c;    n--;  }  return c;  //当n是1或2时  不进入循环 返回c = 0  err  //所以c初始化为1}int main(){  int n = 0;  scanf("%d", &n);  int ret = Fic(n);  printf("%d", ret);  return 0;}
复制代码



运行结果:



递归习题练习到这里就差不多结束了,明天,我会给大家带来两个经典的递归问题:青蛙跳台阶和汉诺塔问题!欢迎大家持续关注!

今天就先到这吧~感谢你能看到这里!希望对你有所帮助!欢迎老铁们点个关注订阅这个专题! 同时欢迎大佬们批评指正!


发布于: 刚刚阅读数: 3
用户头像

芒果酱

关注

我们都在努力奔跑,我们都是追梦人! 2022.02.14 加入

个人宣言:功崇惟志,业广惟勤 个人简介: 0.在校大学生 1.CSDN:C/C++领域新星创作者 2.掘金LV3创作者 3.华为云开发者社区云享专家 4.阿里云开发者社区专家博主 5.InfoQ创作者

评论

发布
暂无评论
函数递归习题(easy版)_c++_芒果酱_InfoQ写作社区