一道递归的好题

简介: <p>题目描述:</p> <p>设整型数组A中有n个元素,输出从这n个数中取出的k个数的所有组合(k<=n)。例如:若A中存放的数是1,2,3,4,5,k为3,则输出结果应为:123,124,125,134,135,145,234,235,245,345</p> <p>题目分析:</p> <p>从数组A中选出K(本题中k=3)个元素,为了避免重复和泄漏,可分别求出包括A[0]和

题目描述:

设整型数组A中有n个元素,输出从这n个数中取出的k个数的所有组合(k<=n)。例如:若A中存放的数是1,2,3,4,5,k为3,则输出结果应为:123,124,125,134,135,145,234,235,245,345

题目分析:

从数组A中选出K(本题中k=3)个元素,为了避免重复和泄漏,可分别求出包括A[0]和不包括A[0]的所有组合。即包括A[0]时,求出A[1...n]中取出k-1个数的所有组合,不包括A[0]时,求出A[1...n]中取出k个元素的所有组合。将这两种情况合到一起,就是最终的结果。

#include <stdio.h>
int b[3];
int a[]={1,2,3,4,5};
void comb(int i,int j,int k)
{
	if(k==0)
	{
		for(int m=0;m<3;m++)
			printf("%d",b[m]);
		printf("\n");
	}
	else if(i+k-1<5)
	{
		b[j++]=a[i];
		
	
		comb(i+1,j,k-1);//在里面了
		comb(i+1,j-1,k);//不在里面了	
	}
}

int main()
{
	comb(0,0,3);
	return 0;
}

输出结果:



大家可以思考,若要逆向输出,即本题输出543,542,541,532,531,521,432,431,421,321。算法该做怎样的调整呢?


---------------我是华丽的分割线-----------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>
int b[3];
int a[]={1,2,3,4,5};
void comb(int i,int j,int k)
{
	if(k==0)
	{
		for(int m=0;m<3;m++)
			printf("%d",b[m]);
		printf("\n");
	}
	else if(i-k+1>=0)
	{
		b[j++]=a[i];
		
	
		comb(i-1,j,k-1);//在里面了
		comb(i-1,j-1,k);//不在里面了	
	}

		

}

int main()
{
	comb(4,0,3);
	return 0;
}


输出结果:




目录
相关文章
|
5月前
|
存储 缓存 算法
动归和递归算法讲解
动归和递归算法讲解
|
机器学习/深度学习
青蛙跳台阶(递归)
青蛙跳台阶(递归)
97 0
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
60 0
|
算法
【算法思维训练-剑指Offer联名 二】递归与循环篇
【算法思维训练-剑指Offer联名 二】递归与循环篇
90 0
汉诺塔+小青蛙跳台阶---《递归》
汉诺塔+小青蛙跳台阶---《递归》
101 0
汉诺塔?爬楼梯?斐波那契?知道递归就够了
汉诺塔?爬楼梯?斐波那契?知道递归就够了
97 0
|
C语言
【C】青蛙跳台阶和汉诺塔问题(递归)
【C】青蛙跳台阶和汉诺塔问题(递归)
124 0
【C】青蛙跳台阶和汉诺塔问题(递归)
【递归】青蛙跳台阶的变式题你还会吗?
【递归】青蛙跳台阶的变式题你还会吗?
123 0
【递归】青蛙跳台阶的变式题你还会吗?
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
(蓝桥杯)递推与递归,前缀和,二分经典例题分析
|
算法 Java
【递归与回溯算法】汉诺塔与八皇后问题详解
文章目录 1 汉诺塔问题 1.1 汉诺塔问题概述 1.2 思路分析 1.3 代码实现(Java) 1.4 结果验证 2 八皇后问题 2.1 八皇后问题概述 2.2 思路分析 2.2.1 问题划分与分析 2.2.2 涉及到的数据结构分析 2.2.3 上下对角线与行列的关系 2.3 代码实现(Java) 2.4 结果验证
【递归与回溯算法】汉诺塔与八皇后问题详解