循环与递归

循环

(1)对于任意n矩阵输出如下规律图形

1

5       2

8       6       3

10      9       7       4

void fun(){	
	int i,j;
	int n,k;
	int a[100][100];

	cout<<"请输入n: ";
	cin>>n;
		
	k=0;
	for(i=0;i<n;i++){
		for(j=0;j<n-i;j++){
			k++;
			a[i+j][j] = k;
		}
	}

	for(i=0;i<n;i++){
		for(j=0;j<=i;j++)
			cout<<a[i][j]<<"\t";
		cout<<endl<<endl;
	}
}

(2)输出1000以内所有完数

完数:一个数恰好等于它所有因子之和

如 6 = 1+2+3 (1,2,3都是6的因子)

void main(){
	int i,j;
	int sum,k=0;
	int a[30];

	for(i=0;i<1000;i++){
		sum = 1;
		for(j=2;j<=i/2;j++)
			if(i%j==0)
				sum += j;
		if(i == sum)
			a[k++] = i;
	}

	cout<<"完数有:"<<endl;
	for(i=0;i<k;i++)
		cout<<a[i]<<"  ";
}

完数有:

1  6  28  496  


(3)求一个矩阵的鞍点,即在行上最小列上最大的点

//求鞍点
void fun(int a[][4],int n){
	int i,j;
	int min,minNum;
	for(i=0;i<n;i++){
		min = a[i][0];
		minNum = 0;
		for(j=0;j<n;j++)
			if(a[i][j]<min){
				min = a[i][j];
				minNum = j;
			}
		
		//cout<<"min"<<i<<": "<<min<<endl;

		bool b = true;
		for(j=0;j<n;j++)
			if(min<a[j][minNum])
				b = false;

		if(b)
			cout<<"Result :a["<<i<<"]["<<minNum<<"] = "<<min<<endl;
	}

}



递归

(1)汉诺塔

void hanoi(int n,char a,char b,char c){
	if(n>0)
	{
		hanoi(n-1,a,c,b);
		cout<<"Move p"<<n<<":  "<<a<<" --> "<<b<<endl;
		hanoi(n-1,c,b,a);
	}
}

循环与递归_第1张图片

(2)整数划分

将n表示成一系列正整数之和的表达式

如  6 可划分为:

6

5+1

4+2 4+1+1

3+3 3+2+1 3+1+1+1

2+2+2 2+2+1+12+1+1+1+1

1+1+1+1+1+1


//整数划分
int divi(int n,int m){
	if(n<0)
		cout<<"cin Error"<<endl;
	else if(n<=1||m==1)
		return 1;
	else if(n<m)
		return divi(n,n);
	else
		return divi(n,m-1) + divi(n-m,m);
}


(3)//任何数都可以用2的r次幂来表示

7 = 2^2 + 2^1 + 2^0

1315 = 2^10 + 2^8 + 2^5 + 2^1 +2^0


//任何数都可以用2的r次幂来表示
void tryR(int n,int r){
	if(n==1)
		cout<<"2^"<<r;
	else{
		tryR(n/2,r+1);
		if(n%2==1)
			cout<<" + 2^"<<r;
	}
}



循环与递归比较

n个自然数中r个数的组合排序(不考虑相同数)
//循环实现
void for0(int n,int r){
	int i,j,k;
	int total=0;
	for(i=1;i<=n-r+1;i++)
		for(j=i+1;j<=n-r+2;j++)
			for(k=j+1;k<=n-r+3;k++){
				total++;
				cout<<i<<"\t"<<j<<"\t"<<k<<endl;
			}
}

循环与递归_第2张图片

你可能感兴趣的:(递归,循环)