C语言函数递归与迭代

本文探讨了递归的必要条件、递归函数如打印数字、strlen模拟、阶乘计算以及斐波那契数列的递归与迭代实现,强调了避免栈溢出和时间复杂度优化的重要性。
摘要由CSDN通过智能技术生成

建议多刷题

递归两个必要条件
1.存在限制条件
2.每次递归后越来越接近这个限制条件
3.满足以上两个条件也不一定递归成功

递归例子

1.输入一串数,挨个打印数字

void print(unsigned int n)
{
	if (n > 9) //不写会导致死递归,进而栈溢出(stack overflow)
	{
		print( n / 10);
	}
	printf("%d ", n % 10);
}
int main()
{
	unsigned int num = 0;
	//%d是有符号整数,有正负数
	//%u打印无符号整数
	scanf("%u", &num);
	print(num);
	return 0;
}

可以理解成,当if在前printf在后时,反着输出printf的功能

2.模拟实现strlen,且不使用临时变量

int slen(char* str)  
//把数组/字符串放入函数中,本质是将首字符地址传入 参数部分写成指针形式
//int slen(char str[]) 参数部分写成数组形式,也行得通
{
	if (*str != '\0')
	{
		return 1 + slen(++str);  
		//str+1 可以将指针地址 + 1 ,但是写成str++就不可以
		//++str可以但不推荐写,因为会改变str的值,最好写成str+1
	}
	else
	{
		return 0;
	}
}
int main()
{
	char arr[] = "abc";  //[a b c\0]
	int len=slen(arr);
	printf("%d", len);
	return 0;
}

3.n的阶乘

int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
}

求第n个斐波那契数
使用递归,时间复杂度2^n

//数列思想
int fib(int n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}

使用迭代

int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值