递归的思想来求解“兔子数列”

(一).使用函数递归来不创建临时变量求字符串的长度

步骤一:大事化小 。如求”hello”的长度。

步骤二:分析

1.由于是求字符串的长度,所以使用数组会很方便。创建一个arr数组用来存放hello这个字符串。

2.每次取出数组中的一个元素,只要该元素不为0,那么就说明该字符串的长度应该加一。

结构体函数代码:如下

int my_strlen(char* str)//形参为指针,指向数组中的元素
{
	if (*str != 0)	
	return 1 + my_strlen(str + 1);//只要该数组的元素不为0,就返回值加一
	else
	return 0;	
}

 步骤三:调用

#include<stdio.h>
int my_strlen(char* str)
{
	if (*str != 0)	
	return 1 + my_strlen(str + 1);
	else
	return 0;	
}
int main()
{
    char arr[] = "hello";
	int l = 0;
	l = my_strlen(arr);
	printf("%d", l);
	return 0;
}

(二)递归与迭代

1.迭代:也就是循环来求解问题:比如求n的阶乘

部分代码如下

for (int i = 0;i <= n;i++)
	{
		e = e * i;//初始化e为1即可
	}

2.递归:函数自己调用自己

两个方法的选择:应该择优而选,总的来说各有优势。比如使用迭代会简化代码的数量,但是

会加大计算,迭代计算效率会高很多。如下求斐波那契数列的第n项数

步骤一:思路分析:

1. 斐波那契数列形式为 1 1 2 3 5 8 13 21 34 55.... 也就是除了第一二个数外其余的数为前两个相加。则第n个就分为n<=2和n>2来计算

2.具体如图:


递归:

代码如下:

#include<stdio.h>
int fib(int x)
{
	if (x <= 2)
		return 1;//当前两项的时候返回值为1
	else
		return fib(x - 1) + fib(x - 2);//n>2的时候返回值为前面数的加和
}
int main()
{
	int n = 0;

	scanf_s("%d", &n);
	int m = fib(n);
	printf("%d", m);
	return 0;
}

可以看出此代码的缺点很明显,就是进行了大量的重复计算,具体可以加一些代码来验证

如在执行体函数中加上如下代码来看重复次数:

if(x==3)

count ++;

具体如下:可以看出仅仅第20个数的时候,3就被计算了上千次,所以效率是不高的,可以自己试一试,输入n=40~50,会需要一定的时间才会出结果。

迭代:

原理分析如下图:

也就是定义a,b,c,初始化a=1,b=1,c=a+b。然后使用循环交换a,b,c的值。

具体代码如下:

#include<stdio.h>
int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n >= 2)//只有当n比2大的时候才会进行该计算
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
    return c;//当n比2小的时候,就会返回c的值即为1
}
int main()
{
	int n = 0;	
	scanf_s("%d", &n);
	int m = fib(n);
	printf("第%d个斐波那契数为:%d\n",n, m);	
	return 0;
}

上述用迭代的方法是很快的,但缺点就是代码数量多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值