递归题目(二)
求字符串长度
分析题目:
字符字符串长度结束的表示是\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;
}