| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2534 人关注过本帖
标题:递归函数
只看楼主 加入收藏
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
你这个数据量很大,要用递归资源消耗太大,要做128位,好像是天文数字。你用数学全排列算算结果是多少字节。
2017-01-14 22:40
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
以下是引用y529879803在2017-1-14 13:05:23的发言:

dalao,书上的全排列默认是1个元素只用一次。。。举例我想要的是用1,2排列3位排列
得到8个结果
111
112
121
122
211
212
221
222这样的。。。

全排列应是n个元素排n列,这个不是全排列了。
这个是n个元素排m列。
这个n有什么要求?如:一定是自然数列0,1,2,3,...或不一定是自然数列0,123,22,345,...。
这个m有什么要求?如:m>=n。
2017-01-14 23:23
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 22楼 吹水佬
你说的m就是元素数量的位数次方啊,比如3位数(不一定是位数,输入不同的字符就可以)2个元素就是2的三次方就是8,这样的。我第二页的搞法不可能搞到一两百位的,所以应该还是有什么自动确定位数并排列的方法才对吧。。。就是我不知道。链表可以吗?还是递归。。。反正我递归的次数可以限制对,但是结果全是错的qaq,链表压根不会,期末考试的课程设计是复用的例题

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


碧蓝航线真好玩
2017-01-15 14:05
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
全排列(位数,可用字符数)
{
全排列(位数-1,可用字符数);
for(i=0;i<可用字符数;i++)
   {
    将第i个可用字符固定放在第一位;
    可用字符表剔除第i个字符;
    全排列(位数-1,可用字符数-1);
    }

}
2017-01-15 15:32
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
全排列用递归实现顶多减少一个循环~不像汉诺塔那样体现出递归的巨大优势~如果数字可以重复使用,相当于N进制,逢N进1~但感觉上3次方的上限不会太大~5的3次方等于125~6的三次方就是256了~明显超过A表~N最多等于5~但实际上~这样做对字符要求太过苛刻了吧~我似乎A表等于1的那个字符不那么标准~A表等于27的好像也不是可打印字符~这实际要斟酌一下~

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


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-15 17:13
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 24楼 ICU
dalao我也是这么想的但是我写不出来具体的代码,能不能给个具体的举个例子我学习下。。。拜托了!

碧蓝航线真好玩
2017-01-15 19:43
y529879803
Rank: 1
等 级:等待验证会员
帖 子:65
专家分:7
注 册:2016-11-10
收藏
得分:0 
回复 25楼 九转星河
我有点没懂了。。。逢n进一那个没错其实我做的东西应该就是那玩意。。。但是dalao你说的后面的那些我没懂。。。比如A表是啥啊dalao?

碧蓝航线真好玩
2017-01-15 19:45
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
嗯,这还真不是全排列,就是九版主说的计数器。
所谓排列是在集合m中选取n个数(n<=m),组成n的子集的每个元素同一时刻只能出现一次,整个排列中组成n的元素可以相同但必须位置不同,当n=m时称谓全排列。组合则是排列的子集,每个元素的排列只能出现一次,位置不同也不行(想想双色球吧,就是组合)。
2017-01-15 19:58
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
//WinXP,Visual C++ 6.0,Win32 Console
#include "stdafx.h"

#define MAXDICT 100
char dict[MAXDICT]="0123456789abcdefghijklmnopqrstuvwxyz";//字典字符
char dicttemp[MAXDICT];//排列后的缓存
int numbers=3;//排列的字符位数
int dictn=16;//可用字符数,从字典数组前部截取

void perm(int,int);
//第一个参数是排列的字符位置数,第二个参数是可用字符数
void perm(int s,int n)
{
    int i=0;
   
    if(s>=0)
    {
        for(i=0;i<n;i++)
        {
        dicttemp[numbers-s]=dict[i];//指定第s个字符
        perm(s-1,n);//进入递归后指定第s+1个字符
        }
    }

    if(s==0)//最后一个字符指定后输出
    {
        for(i=0;i<numbers;i++)printf("%c",dicttemp[i]);
        printf("\n");
    }
}

int main(int argc, char* argv[])
{
    perm(numbers,dictn);
    return 0;
}
2017-01-16 00:07
ICU
Rank: 4
等 级:业余侠客
威 望:2
帖 子:92
专家分:268
注 册:2017-1-14
收藏
得分:0 
//在主函数中再做一个循环,产生小于设定排列长度的字符串:效果就和楼主在10楼抓图的结果完全一样了
for(int i=1;i<numbers;i++)perm(...)
2017-01-16 00:26
快速回复:递归函数
数据加载中...
 
   



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

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