| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2631 人关注过本帖
标题:递归函数
只看楼主 加入收藏
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
 问题点数:0 回复次数:31 
递归函数
放寒假继续学习,想做可重复使用元素的全排列结果做不出来,请问怎么使用递归函数算出来。。。我希望达到可以输入排列位数和元素,计算出所有的排列这样的结果,但是现在做出来的东西要根据位数不同自己改代码,这个是我做的,只能算三位时的情况。就是说通过一个递归函数(也可以是别的方法)让电脑自动计算4位5位时的所有排列,谢谢,祝大家新年快乐。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<conio.h>
main()
{
FILE *p;
int a,d,e,g,h,i,j,l=0,m,n,o,x=0;
char b[129];
char c;
p=fopen ("d:\\pailie.dat","w+");
printf("输入排列位数\n");
scanf("%d",&a);//a为位数
c=getchar();//字符c吸收回车符,不然就必须先输入字符串再输入数字
printf("输入组成排列的数字字母和符号,每个符号只输入一次,不以空格分隔(空格是符号)\n");
gets (b);    //b这个字符串为构成排列的数字字母和符号,129是ascii字符集的127(从0到127)加2个
e=strlen (b);//e为构成排列的数字字母和符号的个数
d=pow (e,a);//d为相异元素(数字字母符号)可以重复排列时的需要计算的最大次数(就是元素可以重复排列时的排列数)
for(h=0;h<e;h++)
{   
for(g=0;g<e;g++)
{
for(i=0;i<e;i++)
{        
putchar (b[h]);
fputc (b[h],p);
putchar(b[g]);
fputc (b[g],p);
putchar (b[i]);
fputc (b[i],p);
printf("\n");
fputc ('\n',p);
}
}
}
}












































搜索更多相关主题的帖子: include 元素 
2017-01-13 19:14
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10608
专家分:43190
注 册:2014-5-20
收藏
得分:0 
用“换位法”好理解和可靠高效,不用嵌套循环也可取得一组排列数据。
搜索“换位排列”应该有不少信息。
2017-01-14 08:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
全排列算法,我曾经写过一次如果叫我再重写,我想我会大出血了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-14 12:39
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 2楼 吹水佬
谢谢啦,我去找找。

碧蓝航线真好玩
2017-01-14 12:59
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 3楼 九转星河
dalao能给我看一下你那个吗。。。话说我看到别人做的成品会从排列位数只有1位到需要的排列位数的(比如5位)全部列出来啊,dalao你的也是吗?

碧蓝航线真好玩
2017-01-14 13:02
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 2楼 吹水佬
dalao,书上的全排列默认是1个元素只用一次。。。举例我想要的是用1,2排列3位排列
得到8个结果
111
112
121
122
211
212
221
222这样的。。。

碧蓝航线真好玩
2017-01-14 13:05
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 y529879803
这个比只取一次的简单~用"进位法"~满
进位~我那个也只适用于只取一次的~

对哦,如果计上0位这样写会比较方便~

[此贴子已经被作者于2017-1-14 13:14编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-14 13:12
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 7楼 九转星河
可以更详细点吗dalao,我只是刚入坑的萌新完全不懂。。。

碧蓝航线真好玩
2017-01-14 13:22
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 y529879803
这个能满足你的题意~没规定每个数只能取一次~

程序代码:
#include<stdio.h>
#define N 5
void reverse(int a[])//为了方便习惯逻辑,可以用reverse函数,去掉也可以~
{
    int i=0;
    int j=N-1;
    int t=0;

    for (i=0;i<j;i++,j--)
    {
        t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
}
void print(int a[])
{
    int i=0;

    for (i=0;i<N;i++)
        printf("%d",a[i]);

    printf(" ");
}

int main()
{
    int a[N+1]={0};
    int count=0;
    for (count=0;a[N]<1;count=0)
    {
        reverse(a);//这个函数不用可以去掉
        print(a);
        reverse(a);//这个函数不用可以去掉
        while (a[count]>=N)
        {
            a[count]=0;
            count++;
        }
        a[count]++;
    }
}


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-14 13:29
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 9楼 九转星河
dalao,我希望有这样的结果,编程完毕以后不需要再改代码的。。。然而我做不出来qaq
图片附件: 游客没有浏览图片的权限,请 登录注册

碧蓝航线真好玩
2017-01-14 14:30
快速回复:递归函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018428 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved