递归10小题

注:操作数字的数组均为int 型,操作字符串均为char

下面的10个问题很常见,在这里都是用递归解决的。涉及到数组的问题,需要有指针的知识。

1.求1到n的和

cpp 复制代码
int getSum(int n)//求1到n的和
{
	if(n==1)
	{
		return 1;
	}
	return n+getSum(n-1);	
}

2.遍历数组

cpp 复制代码
void traverseArray(int * array,int length)
{
	if(length==1)//length是数组的长度,用来控制递归的深度以及结束递归
	{
	cout<<*array<<endl;//用length==1结束递归,只是为了遍历数组尾元素时不带逗号,美观一点
		return;
	}
	cout<<*array<<",";//依次遍历数组中的每个元素
	traverseArray(array+1,length-1);//
}

3.为数组的每个元素赋值

cpp 复制代码
void inputForArray(int * array,int length)//给出数组首地址和数组长度
{
	if(length==0)
	{
		return;
	}
	cin>>*array;
	inputForArray(array+1,length-1);
}

4.逆序遍历数组

例:数组10,3,9,26,93,94

输出:94,93,26,9,3,10

cpp 复制代码
void traverseReversely(int * array,int length)
{
	if(length==1)
	{
		cout<<array[length-1]<<endl;;
		return;
	}
	cout<<array[length-1]<<",";
	traverseReversely(array,length-1);		
}

5.颠倒数组中的元素

例:

原数组 10,3,9,26,93,94

颠倒后的数组 94,93,26,9,3,10

cpp 复制代码
void reverse(int * array,int length)
{
	if(length==0 || length==1)
	{
		return;
	}
	int temporary=array[0];
	array[0]=array[length-1];
	array[length-1]=temporary;
	reverse(array+1,length-2);
}

也可以是这样的递归

cpp 复制代码
void reverse(int * array,int length)
{
	if(length==0 || length==1)
	{
		return;
	}
	reverse(array+1,length-2);
	int temporary=array[0];
	array[0]=array[length-1];
	array[length-1]=temporary;
}

6.求出数组中的最大值

cpp 复制代码
int getMaximum(int * array,int length)
{
	if(length==1)
	{
		return *array;
	}
	int maximum;//避免二次调用getMaximum函数
	maximum=*array>(maximum=getMaximum(array+1,length-1))?*array:maximum;
	return maximum;
}

7.输入一个整数n(n>0),将其逆序输出

例:n=12345,输出为54321

cpp 复制代码
void reveal(long number)
{
	if(number<=9)//当number变成一位数时,即刻输出number,结束递归
	{
		cout<<number<<endl;
		return;
	}
	cout<<number%10;//不断对10取余,输出个位数
	reveal(number/10);
}

8.字符串翻转

例:

输入 "IAmIronMan"

输出 "naMnorImAI"

cpp 复制代码
void traverseStringReversely0(char * source)
{
	if(!*source)//if(!*source)、if(*source=='\0')、if(*source==0)三者意思相同
	{
		return;
	}
	traverseStringReversely0(source+1);
	cout<<*source;
}

void traverseStringReversely(char * source)//在主程序中调用它
{
	traverseStringReversely0(source);//递归函数中缺少换行
	cout<<endl;//在这个函数中单独加上
}

9.任意输入一个整数n(n>0),将其输出为二进制形式

输入:6

输出:110

cpp 复制代码
void transform(int number)
{
	if(number==0)
	{
		return;
	}
	transform(number/2);
	cout<<number%2;
}

10.求100到999之间的水仙花数

cpp 复制代码
int isDaffodilNumber(int number)	//number>=100 且 number<1000 判断number是不是水仙花数
{
	if(number>9)
	{
		int one=number%10;
		one=one*one*one+isDaffodilNumber(number/10);
		return one;//返回各个位立方之后的和,若和与number相等,则为水仙花数,否则非水仙花数
	}else
	{
		return number*number*number;
	}
	
}

//主函数中调用getDaffodilNumber
void getDaffodilNumber(int begin,int end) //begin>=100,end>=100,begin>end
{										//给定三位数的范围,begin最小为100,end最大为1000
	if(begin>end)
	{
		return;			
	}
	if(isDaffodilNumber(begin)==begin)
	{
		cout<<begin<<endl;
	}
	getDaffodilNumber(begin+1,end);
}
相关推荐
luj_17686 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海9 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz10 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni10 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu10 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_79810 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭10 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶10 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶11 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z11 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法