💘作者:你我皆为凡人

 💘博客主页:你我皆为凡人的博客

 💘名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!

 💘觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

 💘系列作品:

 💘

 💘C语言编程刷题篇

 💘经典题型系列

 

 

文章目录

目录

文章目录

🙈 前言

💫关于递归的描述错误的是:( )

 💙 答案与解析:

💫根据下面递归函数:调用函数Fun(2),返回值是多少( )

 💙 答案与解析: 

💫递归方式实现打印一个整数的每一位

 💙 答案与解析:

💫递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

 💙 答案与解析:

💫递归和非递归分别实现strlen

 💙 答案与解析:

💫字符串反向排列(不是逆序)(递归实现)

 💙 答案与解析:

💫计算一个数的每位之和(递归实现)

 💙 答案与解析:

💫递归实现n的k次方

 💙 答案与解析:

💫递归与非递归计算斐波那契数

 🙈 总结


🙈 前言

关于C语言中的经典题型,你又了解多少呢?凡人在这里给初学者准备了九道关于C语言中递归的题型,让初学者可以很好的练习练习,巩固所学知识


提示:以下是本篇文章正文内容,下面案例可供参考

💫关于递归的描述错误的是:( )

A.存在限制条件,当满足这个限制条件的时候,递归便不再继续

B.每次递归调用之后越来越接近这个限制条件

C.递归可以无限递归下去

D.递归层次太深,会出现栈溢出现象

 💙 答案与解析:

 错误的回答是c选项,递归需要两个条件,第一个是必须要有限制条件,每次递归调用时越来越接近这个条件,所以c选项自动排除,不能是死递归,第四个选项,层次太深的话是会出现栈溢出的现象也是对的

💫根据下面递归函数:调用函数Fun(2),返回值是多少( )

int Fun(int n)      
{ 
  if(n==5)   
    return 2;     
  else     
    return 2*Fun(n+1);      
}

A.2

B.4

C.8

D.16

 💙 答案与解析: 

正确答案为D

传参为2,2不等于5,返回2*fun(3),3不等于5,返回2*fun(4),4不等于5,返回2*fun(5),5等于5,返回2,开始回带,2*fun(2)为4,2*fun(4)为8,2*fun(8)为16,所以最后返回的结果为16

 

💫递归方式实现打印一个整数的每一位

 💙 答案与解析:

用递归的函数的思想是大事化小,并且有一个限制条件,定义一个数,实现打印函数,如果要打印1234这个数, 1234打印4最好打印,可以分为  (123) 4    (12)3 4    (1)2 3 4

这样就把大事化小了,实现:设定条件,如果大于9,两位数的就拆分,一位数就停下来,,1234/10,调用123,123大于9,123/10,调用12,12大于9,12/10,1,1小于9,开始会带,打印1%10为1,然后2,3,4

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

💫递归和非递归分别实现求n的阶乘(不考虑溢出的问题)

 💙 答案与解析:

求n的阶乘有个公式,如果求5的阶乘,那么相当于5*4的阶乘,但是如果是1的时候就不是了,所以实现:当n小于等于1时,返回1,否则返回n*fac(n-1),这件事递归实现,非递归的方式就是利用循环让每个乘积到ret中,最后返回ret就是和

//递归方式
#include<stdio.h>
int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n* fac(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d", ret);
	return 0;
}
//迭代方式-非递归
#include<stdio.h>
int fac(int n)
{
	int ret = 1;
	int i = 0;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	return ret;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d", ret);
	return 0;
}

💫递归和非递归分别实现strlen

 💙 答案与解析:

strlen是求字符串的长度,而字符串的长度是由\0来标识的,只要遇到\0就停止,递归实现:如果字符串中不等于\0时,就返回一个1+n+1,因为可以让它指向下一个字符,当等于\0时,返回0,迭代实现,与上面同理,只不过需要定于个ret来接受,如果不等于\0,加加,让字符也加加指向下一个

//递归实现
#include<stdio.h>
int fac(char* n)
{
	if (*n != '\0')
		return 1 + fac(n + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "abcdef";
	int ret = fac(arr);
	printf("%d", ret);
	return 0;
}
//非递归
#include<stdio.h>
int fac(char* n)
{
	int ret = 0;
	while (*n != '\0')
	{
		*n++;
		ret++;
	}
	return ret;
}
int main()
{
	char arr[] = "abcdef";
	int ret = fac(arr);
	printf("%d", ret);
	return 0;
}

💫字符串反向排列(不是逆序)(递归实现)

内容实现:

编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。

要求:不能使用C函数库中的字符串操作函数。

比如:

char arr[] = "abcdef";

逆序之后数组的内容变成:fedcba

 💙 答案与解析:

这个题目的要求是将字符串反向打印,而不是逆序,而且不能使用c函数中的字符串操作函数

既然要反向,那么需要交换两个字符的位置,然后打印即可,递归实现:求一个字符串“abcdef”,在字符串里的是abcdef\0,大事化小,先把a放到临时变量里,然后把f放到a里,然后把\0放入f中,让bcde\0变成新的字符串,而调用自己的时候需要设定条件,如果中间剩下一个的时候就不需要交换了,所以大于等于2的时候调用

int my_strlen(char* string)
{
	int ret = 0;
	while (*string != '\0')
	{
		ret++;
		string++;
	}
	return ret;
}
void reverse(char* string)
{
	int len = my_strlen(string);
	char tmp = *string;
	*string = *(string+len-1);
	*(string + len - 1) = '\0';
	if (my_strlen(string + 1) >= 2)
		reverse(string + 1);
	*(string + len - 1) = tmp;
}
int main()
{
	char arr[] = "abcdef";
	reverse(arr);
	printf("%s", arr);
	return 0;
}

💫计算一个数的每位之和(递归实现)

内容实现

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729,输出:19

 💙 答案与解析:

求一个非负整数每个位数之和,如1729可以分成 172 + 9,  17 + 2 + 9 , 1 +7+2+9,递归实现,如果是一位数的时候,返回这个数,如果大于一位数,返回 除以10加上摸10的值,1729/10  172  递归递下去,归回来的每位数加上取余的数

int fac(unsigned int n)
{
	if (n > 9)
	{
		return fac(n / 10) + n % 10;
	}
	return n;
}
int main()
{
	unsigned int n = 0;
	scanf("%d", &n);
	int sum = fac(n);
	printf("%d", sum);
	return 0;
}

💫递归实现n的k次方

内容实现

编写一个函数实现n的k次方,使用递归实现。

 💙 答案与解析:

求一个数的k次方,实际上与pow函数一样,可以发现公式,如果k大于0的时候 为n*pow(n,k-1),如果小于0,为1.0/pow(n,-k),为小数,如果等于0的时候,为1,按照公式照搬就好

double Pow(int n, int k)
{
	if (k > 0)
		return n * Pow(n, k - 1);
	else if (k < 0)
		return 1.0/ Pow(n, -k);
	else
		return 1;
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d%d", &n, &k);
	double sum = Pow(n, k);
	printf("%.3lf", sum);
	return 0;
}

💫递归与非递归计算斐波那契数

内容实现

递归和非递归分别实现求第n个斐波那契数

例如:

输入:5  输出:5

输入:10, 输出:55

输入:2, 输出:1

 斐波那契数列的特点是前两个为1,从第三个开始为第一个和第二个的和,依次类推可以得到规律,递归实现:如果大于2的时候,返回n-1与n+1的和,这个是从后往前来进行,计算量很大,因为知道n-1的时候需要把前面都知道,有很多重复计算,耗时耗力,不推荐,非递归实现:我们可以从前往后来实现,第一个和第二个都是1,从第三个开始,第一个为a,第二个为b,第三个为a+b,从第一二个没必要开始,从第三个开始计算,为a+b,然后把a赋值为b,b赋值为c来调换,依次循环

int fac(int n)
{
	if (n > 2)
	{
		return fac(n - 1) + fac(n - 2);
	}
	return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d", ret);
	return 0;
}
int fac(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n >= 3)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d", ret);
	return 0;
}

 🙈 总结

对于函数来说,最重要的莫过于递归了,而想要把递归搞明白,需要大量的练习用来提升自己的思路,只有思路变灵活了,不再那么朦胧,那么这个时候你就发现你慢慢的会了,凡人在这里给大家准备了九道关于递归的一些练习题,大家可以尝试着练习练习,如果觉得凡人讲解的还不错,希望大家多多支持,哪里有不对,也欢迎大家来指正,感谢大家观看!!!

 

更多推荐

C语言中的这些经典题目你都会了吗?【一文带你回顾经典】【全程高能】