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

原文地址:https://www.cnblogs.com/DismalSnail/p/10546238.html

时间: 2024-09-27 15:42:51

C语言递归练习的相关文章

递归学习(一)最简单的C语言递归求年龄算法

递归是我们在学习编程中,必须要去学习的,虽然递归晦涩难懂 ,但是很多时候,递归的思想会很有用,但是在实际开发中,不建议使用递归,要用循环来代替递归,不然bug无穷. ----------------------------------------------------------- 问题描述: 有5个人坐在一起, 问第5个人,他说比第4个人大2岁, 问第4个人,他说比第3个人大2岁, 问第3个人,他说比第2个人大2岁, 问第2个人,他说比第1个人大2岁, 问最后一个人,他说10岁 第5个人多大

C语言递归

#include<stdio.h> #include<stdlib.h> /* 2014年12月24日18:11:09 求递归 */ int f(int a) { if(1==a) return 1; else return f(a-1)*a; } int main(void) { int a; printf("请输入一个数:"); scanf("%d",&a); printf("%d的阶乘为%d\n",a,f(a

C语言 &#183; 递归倒置字符数组

算法提高 递归倒置字符数组 时间限制:1.0s   内存限制:512.0MB 问题描述 完成一个递归程序,倒置字符数组.并打印实现过程 递归逻辑为: 当字符长度等于1时,直接返回 否则,调换首尾两个字符,在递归地倒置字符数组的剩下部分 输入格式 字符数组长度及该数组 输出格式 在求解过程中,打印字符数组的变化情况. 最后空一行,在程序结尾处打印倒置后该数组的各个元素. 样例输入 Sample 1 5 abcde Sample 2 1 a 样例输出 Sample 1 ebcda edcba edc

C语言递归,非递归实现翻转链表

翻转链表作为,链表的常用操作,也是面试常遇到的. 分析非递归分析: 非递归用的小技巧比较多,很容易出错. 递归分析比较简单,在代码里面 代码: #include<stdio.h> #include<stdlib.h> typedef int elemtype; typedef struct node{ elemtype element; struct node*next;//写成node* next;node * next;node *next;也是可以的,为了方便阅读,以后统一写

开始学习C语言递归程序,汉诺(hanoi)塔问题尝试

汉诺问题:3个座A, B,C, 在A座有64个大小不等的盘,现在要把64个盘转移到另一个座,每次只能移动一个盘,且大盘不能放在小盘上面. 思考过程. 1)移动1个盘到另一个座需要搬1次,记 a(1) = 1 2)移动2个盘:在已经移动1个盘的基础上(用a1次),将第2个盘放到另一个空座(1次),然后再将第1个盘移动到第2个盘上,需要a1次,记 a(2) = 2 * a(1) + 1 3)移动3个盘:在已经移动2个盘的基础上(用a2次),将第3个盘放到另一个空座(1次),然后再将前2个盘移动到第3

有序链表合并C语言递归版--我稍微会一点编程

假期最后一天,闲着没事编个程,天天吆喝自己不会编程,其实还是稍微会一点的. ??以下是一个有序链表合并的代码,一刻钟内盲写,花了10分钟左右调试通过,通篇只有一个if语句作为递归退出条件! #include <stdio.h> #include <stdlib.h> int a[] = {1,3,5,7,8,10,11,12,15,19,21,22,24,25,26}; int b[] = {2,4,5,6,9,16,17,18,27,30,31}; struct list { s

C语言递归之二叉树的最大深度

题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例 给定二叉树 [3,9,20,null,null,15,7] 3 / 9 20 / 15 7 返回它的最大深度 3 . 题目要求 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * s

C语言递归实现二叉树的先序、中序、后序遍历

#include <stdio.h> #include <stdlib.h> //*****二叉树的二叉链表存储表示*****// typedef struct BiNode { char data; struct BiNode *lchild, *rchild; }BiNode, *BiTree; //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****// void CreateBiTree(BiTree &T) {

汉诺塔的故事(C语言——递归)

汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 1 #include <stdio.h> 2 int move(int n, char x, char y, char z){/* 将 n 个圆盘借助 y 从 x 移动到 z */ 3 if(n ==