使用递归完成复杂程序的简单书写主要以求解第n个斐波拉契数为例

     函数递归操作本质上是创建函数实现对自身调用的功能,是函数的嵌套和链式访问的延伸。对于复杂问题,可以通过函数递归的方式实现代码的简化。针对于连续增减规律问题可以极大地简化代码。

  首先举一个以简单的printf()函数链式访问为例

int main()
{
	printf("%d", printf("%d", printf("%d", strlen("adsf"))));
	return 0;
}

printf()函数的返回值由strlen()的返回值决定,strlen()返回字符串的长度int类型,而printf函数的返回类型是接收返回值的字符数。所以最终打印结果为‘4111’

>>>4111

2 在有了链式访问的基础上,可以简单实现strlen函数的递归编写,在函数的返回值上实现递归调用。

int my_strlen(char* str)
{

	if (*str != '\0')//判断字符串结束标志
	{
		return  1 + my_strlen(str + 1);
	}
	else
		return 0;
}
int main()
{
	char arr[] = "abcdr";//可以改为键入一个字符串
	int ret = my_strlen(arr);//将编写的字符串长度函数值返回
	printf("%d",ret);
	return 0;
}

3 在设计代码求解n!上,递归调用可以极大地简化代码量

做一个比较,先通过普通的循环语句来实现求任意数的阶乘

int main()
{
	int a = 0;
	scanf_s("%d", &a);
	{
		if (a > 1)
		{
			int i = 1;
			int sum = 1;
			for (i = 1;i <= a;i++)
			{
				sum = sum * i;
			}

			printf("阶乘=%d", sum);
		}
		else
		{
			return 1;
		}
			
	}
	
}

采用递归实现任意数阶乘计算

int sugge(int x)
{
	if (x <= 1)
		return 1;
	else
		return x*sugge(x - 1);
}
int main()
{
	int a = 0;
	scanf_s("%d", &a);
	int b = sugge(a);
	printf("%d\n", b);
	return 0;
}

通过以上两种简单的递归使用,不难看出递归实际上是在构造的函数中,在函数返回值上,通过反调用当前函数从而实现对具有一定规律层次的复杂问题简单化处理。然而简化问题是解决问题的一种途径,并不是对于所有的问题递归都能展示出他的高效性。递归存在并使用的同时会占用大量的空间,并且只有访问到最后一层时才会逐步向前传递返回值,所以大量运算容易造成栈溢出。

对于第n项斐波拉契数列的求解(斐波拉契数列:首项和第二项为1,后项依次为前两项之和)

递归法

int count = 0;//定义一个全局变量  直观统计
int get_in(int x)
{
    if (x == 2)//统计第二项出项次数
        //反映该算法在执行时浪费空间大小
    {
        count++;
    }
    if (x <= 2)
        return 1;
    else
        return get_in(x - 1) + get_in(x - 2);//数列定义 后项等于前两项和
}
int main()
{
    int n = 0;
    scanf_s("%d", &n);
    int ret = get_in(n);
    printf("该斐波拉契数列数是=%d\n", ret);
    printf(" 第二个斐波拉契数重复计算次数=% d\n", count);
    return 0;

}

在数据较大时count可以直观反映该调用方式的复杂程度

>>>>>>40
>>该斐波那契数是=102334155
>> 第二个斐波那契数重复计算次数= 63245986

仅仅第40项,第二项的重复计算次数就高达六千万次,所以在这种情况下递归调用并不是最优解;

循环结构

int get_num(int x)
{
	if (x >= 3)
	{
		int i = 0;
		int a = 1;
		int b = 1;
		int c = 0;
		for (i = 3;i <= x;i++)//从第三项开始  前两项均为一
		{
			c = a + b;
			a = b;
			b = c;
		}
		return c;
	}
	else
		return 1;//前两项返回值
}
int main()
{	
	int n = 0;
	scanf_s("%d", &n);
	int ret = get_num(n);
	printf("第n个斐波那契数=%d", ret);
	return 0;
}

在实现上更加简洁,对计算机负荷更小,程序运行更快

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值