c语言 s8 1,C语言递归练习 - osc_s8kmhvea的个人空间 - OSCHINA - 中文开源技术交流社区...

问题描述

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

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

{

*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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值