c语言之函数递归的应用

函数递归的基本

首先,我们要知道函数递归的使用条件。它有两个条件:

1.存在限制条件,当满足这个条件是便不再继续。2.每次调用函数之后会越来越接近这个限制条件。

同时我们要抓住先递再归的核心,并且我觉得应该找到前一次和后一次的关系。接下来,就来到了一些应用

应用一.n的阶乘

首先,我们要知道n阶乘是什么。n!=n*(n-1)*(n-2)*...*2*1 所以,这里我们应该知道怎么写了吧。代码如下:

#include <stdio.h>
int fac1(int n)
{
	if (n <= 1)
	{
		return 1;
	}
	else
	{
		return n * fac1(n - 1);
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac1(n);
	printf("%d\n", ret);
	return 0;
}

 

同时,我们应该还可以想到实现n的阶乘不只可以用递归还可以用循环,在这里我也写出来。代码如下:

#include <stdio.h>
int fac2(int n)
{
	int i = 0,a=1;
	for (i = 1; i<=n; i++)
	{
		a *= i;
	}
	return a;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac2(n);
	printf("%d\n", ret);
	return 0;
}

应用二.逆序打印一个数的每一位

这里,我们就拿1234来作为例子。要想打印个位则1234%10即可,之后我们要想打印3,该怎么办呢,其实这里只用把4去掉继续打印个位即可,要去掉个位应该1234/10,所以我们就写出来了。代码如下: 

 

#include <stdio.h>
void print(int n)
{
	if (n <= 9)
	{
		printf("%d", n);
	}
	else
	{
		printf("%d ", n % 10);
		print(n / 10);
	}
	
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	print(n);
	return 0;

 

应用三.求字符串的长度

字符串结束标志为\0,所以我们会用到指针来实现,让指针依次向后移一位,直到其值为\0为止,此时结束递归。

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

 

求字符串长度还可以用到循环加计数器的方法,这里我也把代码写出来

#include <stdio.h>
int my_strlen(char* arr)
{
	char* left = arr;
	char* right = arr;
	while (*right != '\0')
	{
		right++;
	}
	return right - left;
}
int main()
{
	char arr[] = "Jackson";
	int len = my_strlen(arr);
	printf("%d", len);
}

 

 应用四.求第n个斐波那契数

首先,我们要知道斐波那契数是什么。他是从第三项开始,每一项等于前两项的和,前两项为1。所以第n个斐波那契数等于n-1和n-2的斐波那契数,以此类推,我们就知道这个递归怎么写了。代码如下:

#include <stdio.h>
int Fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}

 

但是,但我们输入较大的数时可以看到,要等一段时间结果才能出来,所以用递归求斐波那契数不是最好的方法,其时间和空间消耗都大。

其实,这里用循环较好一点。代码如下:

#include <stdio.h>
int Fib(int n)
{
	int a = 1, b = 1, c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("%d", ret);
	return 0;
}

 

至此,我想举的例子都写完了。通过这些例子,大家应该都对递归有了更好的掌握。

祝:“码”思泉涌,下“指”如有神。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值