看到一道题。。。。。。(200分)

  • 主题发起人 主题发起人 小天
  • 开始时间 开始时间

小天

Unregistered / Unconfirmed
GUEST, unregistred user!
看到一道题:
求n的全排列(如n=123,则打印123,132,213.......)
要求不用递归,算法尽量简单
 
不用递归就用循环呗. 两层循环应该够用了.
 
嘿嘿,如果连续排的话你这个 n>=10 就难看极了 :-)
n=9时 ,n!=9*8*7*6*5*4*3*2*1=362800 种了
不用递归就用循环了,简单不了 :-(
 
怎么循环丫?
 
为什么不能用递归呢?
 
太奇怪了
 
小天:给你一个思路,代码我懒得写了
比如123456789这9个数(n也一样),把他们放在数组里,如何得到全排列呢?
这是第一个了,然后依次把1放到第2位,第3位...,
一轮完毕,把2放到第3位,第4位...
...
一直到把8放到第9位。
其实就是把第i个数(n>i)由第i位从i+1滚动到第n位的过程。
 
转换成string用copy一个一个取出来循环
 
可以用goto语句和数组模拟递归,不过程序会很难看

 
简单,n位数字中随机取两位交换位置,若结果未出现过,就添至结果集。
结果集最好是存为一个文件。
先得计算这个数字的全排列个数作为循环结束标志,
应考虑到数字相同的情况,如122的个数为3,而不是3!。
此谓精确遗传算法。
 
wjiachun:你的办法只有N*N结果,而全排列应该有N!,所以不对
Button1:那们的话执行效率太低了
zwhc:我说了,这只是一道题,我也知道用递归方便
 
哈哈,错啦错啦,我的方法大错特错 :-)
 
设n为m位数, 取出这m个数字. 然后写一个m重循环, 只有在各个循环指标互不相同时才
把这几个数字组合成为一个数. 循环结束后, 所有的排列也出来了. 具体细节由你考虑吧.
 
我也要,而且要求是越快越好,我另外给分哦。
 
我也要,而且要求是越快越好,我另外给分哦。
 
例如:5678
astring:=inttostr(5678)
for i:=1 to 10000 do
begin
1。分解出i 由几个字符组成。
2。求出这几个字符在astring中的位置(如不在position为“0”)
3。若几个字符的position都大于零且不等则是你的需求。
end

大概思路是如上。
 
如果不用递归会很麻烦!
单用循环可能还做不出!
 
找了半天,居然找不到现成的。于是自己做了一个,我称之为递增进值数法,供各位参考。
使用二重循环。此法主要受限于最大的整数。
算法思想:用这么一种数来表示排列,第1位逢2进1,第2位逢3进1,第3位逢4进1,
然后将此数转换为排列。已经测试正确,至于效率,各位测试吧。
 
后退
顶部