递归题目(二)

简介: 递归题目(二)

求字符串长度


分析题目:

字符字符串长度结束的表示是\0

因此我们只要判断指针是否指向\0即可

如果不是就加一 如果是结束循环

代码如下

int my_strlen(char* x)
{
  int count = 0;
  while (*x !='\0')
  {
    count++;
    x++;
  }
  return count;
}
int main()
{
  char arr[] = "abcdef";
  int m=my_strlen(arr);
  printf("%d", m);
  return 0;
}


这里对于新手来说有个需要注意点的点 就是传入的指针类型

因为数组是char类型的 所以传参的时候记得也要传入char类型的指针


不用临时变量 求字符串长度


题目分析

不用临时变量自然就想到递归的方法

如果是\0那么久返回一个0

如果不是\0就返回一个1+数组指向下一个数的递归


int my_strlen2(char* x)
{
  if (*x !='\0')
  {
    return 1 + my_strlen(x + 1);
  }
  else
  {
    return 0;
  }
}
int main()
{
  char arr[] = "abc123def";
  int m=my_strlen2(arr);
  printf("%d", m);
  return 0;
}


代码如上

易错点依然和上面一题一样

不过有一点值得注意的是 虽然my_strlen()中的x+1可以替换乘 ++x 但是博主却不建议这么做

因为如果这么做的话实际上x的值就改变了 指针指向的位置就改变了

虽然在这一题可能看上去没有什么问题 但是很有可能在以后遇到不可预料的错误


求5的阶乘(两种方式)


阶乘的方法

题目分析:

很简单

如果不是1 返回这个数本身和上一个数的阶乘

如果是1 返回1

代码如下


int my_fac(int x)
{
  if (x>1)
  {
    return x * my_fac(x - 1);
  }
  else
  {
    return 1;
  }
}
int main()
{
  int i = 5;
  int m = my_fac(i);
  printf("%d", m);
  return 0;
}


不用阶乘

这样子更加简单了 前面的文章有过分析 一个for循环就能搞定

int main()
{
  int n = 5;
  int i = 0;
  int fac = 1;
  for ( i = 1; i <= 5; i++)
  {
    fac *= i;
  }
  printf("%d", fac);
  return 0;
}


代码如上


斐波那契数


两种方法

使用阶乘:

题目分析:

当参数为1或者2的时候返回1

当参数为其他值的时候返回上一个数和上上的数字的和

参考代码如下


int fib(int x)
{
  if (x>2)
  {
    return fib(x - 1) + fib(x - 2);
  }
  if (x<=2)
  {
    return 1;
  }
}
int main()
{
  int b = fib(9);
  printf("%d", b);
  return 0;
}


如果不使用递归的话 我们可以使用一种自下而上的思想来解决这道问题

我们可以设定三个参数 a b c

a就是往前数第二个fib数

b就是往前数第一个fib数

c就是当前是fib数

根据此思想指导我们可以有以下代码


int fib(int x)
{
  if (x<=2)
  {
    return 1;
  }
  int a = 1;
  int b = 1;
  int c = 0;
  while (x>2)
  {
    c = a + b;
    a = b;
    b = c;
    x--;
  }
  return c;
}
int main()
{
  int b = fib(2);
  printf("%d", b);
  return 0;
}
相关文章
|
安全 Java Spring
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
本篇带大家一起从源码了解 Spring Boot 内置的Http编码功能
255 8
【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解
|
JavaScript
搭建Vue3组件库:第四章 使用Vitepress搭建文档网站
文档建设一般会是一个静态网站的形式 ,这次采用 Vitepress 完成文档建设工作。 Vitepress 是一款基于Vite 的静态站点生成工具。开发的初衷就是为了建设 Vue 的文档。Vitepress 的方便之处在于,可以使用流行的 Markdown 语法进行编写,也可以直接运行 Vue 的代码。也就是说,它能很方便地完成展示组件 Demo 的任务。
1998 0
搭建Vue3组件库:第四章 使用Vitepress搭建文档网站
|
11月前
|
Java Kotlin 索引
Kotlin - 分支与循环
Kotlin - 分支与循环
86 2
|
前端开发 UED
CSS一些冷门但优化用户体验的样式属性
CSS一些冷门但优化用户体验的样式属性
93 1
|
网络安全 开发工具 数据安全/隐私保护
ipa 如何安装到 iphone
ipa 如何安装到 iphone
|
编译器 C语言
预处理指令
预处理指令
80 0
|
SQL Java Android开发
MyBatisPlus-Lombok的使用及分页功能
MyBatisPlus-Lombok的使用及分页功能
200 0
|
NoSQL 安全 Linux
linux安装redis(保姆级-安装包方式安装-版本6.2.7-解决aof持久化问题)
linux安装redis(保姆级-安装包方式安装-版本6.2.7-解决aof持久化问题)
354 0
linux安装redis(保姆级-安装包方式安装-版本6.2.7-解决aof持久化问题)
【递归进阶练习】全排列
【递归进阶练习】全排列
142 0
|
存储 SQL Oracle
Oracle数据库存储结构
Oracle数据库存储结构
198 0