递归小例子

回文判断

先按要求输入字符串,再从开头和结尾向中间判断,如果出现不相等情况则输出No,如果全都相等则是回文数,输出Yes。

源代码:

#include <iostream>
using namespace std;
void Huiwen(int n,char str[],int m);
int main(){
	int i=0;
	char str[100];
	cin>>str;
	while(str[i]!='\0')
		i++;
	Huiwen(0,str,i-1);
	return 0;
}

void Huiwen(int n,char str[],int m){
	if(str[n]!=str[m]){
		cout<<"No"<<endl;
		return ;
	}
	else{
		if(n<m)
		Huiwen(n+1,str,m-1);
		else
			cout<<"Yes"<<endl;
	}

}

数的因子之和

用递归求 输入的数的因子之和,从比他小的数到1,再和原来的数比较大小,判断是否相等。

源代码:

#include <iostream>
using namespace std;
int Sum(int n,int i);
int main(){
	int n;
	int x;
	cin>>n;
	x=Sum(n,n-1);
	if(n==x)
		cout<<"Yes"<<endl;
	else
		cout<<"No"<<endl;
	return 0;
}

int Sum(int n,int i){
	if(i>0){
	if(n%i==0)
		return Sum(n,i-1)+i;
	else
		return Sum(n,i-1);
	}
	else 
		return 0;
}

集合的幂集

输入集合所含元素和个数,要按顺序输出给定集合的幂集,类似二叉树的形式,将一个函数递归成两个,两个再分别递归求解。

源代码:

#include <iostream>
#include <cstring>
using namespace std;
void Func(int i,char *Temp,int n);
char str[21];

int main()
{
	int n;
	char Temp[21]={0};
	cin>>n>>str;
	Func(0,Temp,n);
	return 0;
}

void Func(int i,char *Temp,int n)
{
	char reTemp[21]; 
	strcpy(reTemp,Temp);  
	if(i==n)
	{
		cout<<"("<<Temp<<")";
		return ;
	}
	else
	{
		Func(i+1,reTemp,n);
		strncat(reTemp,(str+i),1); 
		Func(i+1,reTemp,n);
	}
}

多项式计算

算法描述:
要求多项式的和,已经给定了系数和次方数,只要从最后一项开始乘以x就行,从最后一项往前面循环,用sum表示总结果用sum1表示现在的次方数。注意:要开一个大一点的数组,而且不能用递归和双重循环,以免超时。

源程序:

#include <iostream>
using namespace std;
int main(){
	int i;
	int n,x;
	int a[100001];//开一个大一点的数组
	int sum=0,sum1=1;
	cin>>n>>x;
	for(i=0;i<=n;i++){//存各项系数
		cin>>a[i];
	}
	for(i=n;i>=0;i--){//从最后循环,求出多项式的解
		sum+=a[i]*sum1;
		sum1=sum1*x;
	}
	cout<<sum<<endl;
	return 0;
}

栈的问题

算法描述:
用递归不断的进栈出栈,直到所有的元素都进栈。有要进栈的元素,先进栈,再递归,直到所有的都进栈。待进栈栈中有要出栈的让他们出栈,把这些存入最后要输出的数组中,等到所有都出栈后输出。

源程序:

#include <iostream>
using namespace std;

int s[15];
int ss=0;
int a[15];
int length=0;

void push(int x){//进栈操作
	a[length++]=x;
}
int pop(){
	return a[--length];//出栈操作
}

void stack(int N[],int i,int in,int out){

	if(in==0&&out==0){//如果要进栈和要出栈的都没有输出栈内元素
		for(int j=0;j<i;j++){
			cout<<s[j];
		}
		cout<<endl;
	}

	else{

		if(in>0){//如果有要进栈的,进栈
			push(N[i]);
			stack(N,i+1,in-1,out);
			pop();
		}

		if(out>0&&out>in){//如果有要出栈的出栈
			s[ss++]=pop();
			stack(N,i,in,out-1);
			push(s[--ss]);
		}
	}
}

int main(){
	int n,i;
	cin>>n;
	int N[15];
	for(i=0;i<n;i++){//把1~n存到数组中,以便进出栈
		N[i]=i+1;
	}
	stack(N,0,n,n);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jihome/article/details/94962077