C语言递归练习

时间:2022-09-09 19:30:36

问题描述

输入字母的个数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