递归题目(二)

发布于:2022-12-27 ⋅ 阅读:(163) ⋅ 点赞:(0)

求字符串长度

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

网站公告

今日签到

点亮在社区的每一天
去签到