• 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("
    Enter error,please enter again(m>=n)
    ");
    		scanf("%d%d",&m,&n);
    	}
    	arrange(str,m,n);//递归调用
    	putchar('
    ');
    	return 0;
    }//main
    
  • 相关阅读:
    AngularJS7那些不得不说的事故
    Python和C++的混合编程(使用Boost编写Python的扩展包)
    为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)
    OpenProject基础使用介绍
    负载均衡
    如何搭建wordpress ,wecenter
    nginx 模块
    Nginx
    http 协议
    ssh
  • 原文地址:https://www.cnblogs.com/DismalSnail/p/10546238.html
Copyright © 2020-2023  润新知