C语言递归练习

问题描述

输入字母的个数m,确定字母(从a开始)如输入4,则有a,b,c,d四个字母。编程打印出由这些字母组成的长度为n的所有可能的字符串。例如m=3,则有字母a,b,c。n=2则输出

aa ab ac ba bb bc ca cb cc

分析

我们可以将题目进行抽象,在有放回的前提下,求全部从m个不同的元素中任取n个元素的排列。根据题目的含义,我们可以用整数0~m-1表示这m个不同的元素,将要生成的n个元素分成两部分:第一个元素和其他n-1个元素。如果n=1,即要从m个元素中任取1种,这样有m种不同的取法,我们可以直接使用循环完成。若n>1,则可以知道第一个元素有m种不同的取法,可以针对第一个元素m种不同取法的1种,对后面的n-1个元素进行同样的递归操作即可产生一种新的不同排列。具体算法描述如下:

fun(指向第一个元素的指针,从m个元素中,取n个元素)
{

for(i=0;i < m;i++)

{ 确定第一个元素的选取方法:=i;

  if(n > 1) fun(指向下一个元素的指针,从m中,取n-1个)
  else 完成一种排列

}

}

代码实现


#include <stdio.h>

int str[100];

void print(int *p)
{	
	int *q;
	for(q=str;q!=p+1;q++)
	{
		printf("%c",*q+'a');/*输出结果,将整数转换为字母a起始的序列*/
	}
	putchar(' ');

}//print

void arrange(int *p,int m,int n)/* 从m个元素中取n个存入数组p中*/
{
	int i;						/*用数0~m-1表示m个不同的元素*/
	for(i=0;i<m;i++)			/*依次从数0开始逐个作为第一个元素*/
	{
		*p=i;
		if(n>1)
		{
			arrange(p+1,m,n-1);
		}
		else print(p);
	}
}//arrange


int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	while(n>m)
	{
		printf("\nEnter error,please enter again(m>=n)\n");
		scanf("%d%d",&m,&n);
	}
	arrange(str,m,n);//递归调用
	putchar('\n');
	return 0;
}//main
posted @ 2019-03-17 12:25  DismalSnail  阅读(585)  评论(0编辑  收藏  举报