欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言:(采用PTA浙大题目) 简单递归总结(含部分答案)

程序员文章站 2022-06-07 14:39:41
...

那么为了这期讲解递归的博客,博主特意去把pta比较简单的浙大题目部分的递归刷了一遍,要是觉得博主讲的不错的小伙伴可以关注博主哦!博主会持续更新的????
小伙伴们可以选择性学习哦!

注:代码在算法实例,主要讲解在最后的总结。

目录

1.递归思想

程序调用自身的编程技巧称为递归(recursion),简单来说就是编程技巧。我们在写一个函数时,对这个函数不断的调用其本身,就是一种递归。递归在求很多数列,乃至写不同的算法时十分方便(忽略其时间复杂度和空间复杂度),递归,递归,顾名思义:递和归。
引入图 (取自:卓象程序员)
C语言:(采用PTA浙大题目) 简单递归总结(含部分答案)
到这里其实都是废话。

2.算法实例

这里的代码皆为函数块,小伙伴们可放心使用,与主函数任意搭配????

1.使用递归函数计算1到n之和

我们一般情况下会选择在主函数中使用for循环和while循环的方式去计算。但在函数引用中我们可以使用递归:

int sum( int n )
{
    if(n<0)
        return 0;
	if(n==1)
		return 1;
	else
		return n+sum(n-1);
}
2. 递归求阶乘和

这里我们为了方便使用两个函数。

double fact( int n )
{
	if(n==1||n==0)
		return 1;
	else
		return (double)n*fact(n-1);
}
double factsum( int n )
{
	int i;
	double sum=0;
	for(i=1;i<=n;i++)
	{
		sum+=fact(i);
	}
	return sum;
}
3. 递归实现指数函数

这里不需要math库的函数。

double calc_pow( double x, int n )
{
    if(n == 0)
        return 1;
    return x * calc_pow(x, n - 1);
}
4. 递归求简单交错幂级数的部分和

所谓简单交错幂级数和其实就是:
C语言:(采用PTA浙大题目) 简单递归总结(含部分答案)
我们要做的就是实现它,我们这里需要用到math库。

#include<math.h>
double fn( double x, int n )
{
	if(n==1)
		return x;
	else
		return pow(-1,n-1)*pow(x,n)+fn(x,n-1);	
}
5. 递归计算Ackermenn函数

所谓ack函数便是:
C语言:(采用PTA浙大题目) 简单递归总结(含部分答案)
ok,代码:

int Ack( int m, int n )
{
	if(m>0&&n>0)
		return Ack(m-1,Ack(m,n-1));
	else if(n==0&&m>0)
		return Ack(m-1,1);
	else if(m==0)
		return n+1;
}
6.经典算法,斐波那契
int f( int n)
{
	if(n==0)
		return 0;
	if(n==1||n==2)
		return 1;
	else
		return f(n-1)+f(n-2);
}
7. 十进制转二进制

这里博主会附上一张图,以便小伙伴们能够理解。

void dectobin( int n ){
	//使用递归刚好会符合二进制的算法。
	if(n==0)
		printf("0");
	else if(n==1)
		printf("1");
	else
	{
		dectobin(n/2);
		printf("%d",n%2);
	 } 
		
}

C语言:(采用PTA浙大题目) 简单递归总结(含部分答案)

8. 递归实现顺序输出整数

代码:

void printdigits( int n ){
	
	if(n<10){ //出口 
		printf("%d\n",n); 
	}else{
		printdigits(n/10);
		printf("%d\n",n%10);     
	} 
	
}

alright,代码就提供这么多了,可以供小伙伴们参考。以上的代码思想在python中都是可以用的,小伙伴们也可以转接到python上放心食用。

3.算法总结

  1. 递归的输出顺序是由我们所规定的。如果我们使用return的话,他的return方式其实是这样的,举例:使用递归函数计算1到n之和 C语言:(采用PTA浙大题目) 简单递归总结(含部分答案)
    它的本质是从递归的出口(也就是递归的最深处),一步一步return过来的。而不是从我们明面上第一个return开始return的。

  2. 递归的出口,我们必须要特别的注意,递归就如同循环一样,循环没有停止条件就会周而复始的循环下去,递归同样如此,不同的是,它不是一圈一圈的转而是会不停的往下递归,如果大家看了看上面的代码,会发现每一个递归的算法都有它的出口,我们一般用一个if和一个return来表示,因为这已经满足大多数递归的出口条件。

  3. c语言的return是非常严格的,如果你的return出现了例如(…return a value…)之类的bug说明你的return后接入的式子或者变量有问题。小伙伴们千万不要觉得编译器错误????

  4. 对于返回值要求为void空的函数,我们便不能用return,这时候往往是要进行输出的,否则递归便没有意义,因此小伙伴们在这时候不要迷茫,总想着用return进行递归。我们要明白递归的本质是调用自身函数,而不是不断的return。

  5. 如果小伙伴们学习了时空复杂度,便能看出来递归并不是一定方便的,甚至在大部分情况下的,它的时空复杂度要比用普通的循环还有大。

  6. 博主建议小伙伴动用手里的编译器或解释器自己动手试一试。对递归的熟练程度将会帮助到我们很多。
    over 这一期就到这里的

博主是一名学习机器学习的菜鸟,长时间学习python和c语言,小伙伴们感兴趣的可以关注博主,或者有什么不清楚的小问题,可以私信博主哦(虽然博主大概率也不会????)????

相关标签: pta初级题目