提高自己-高手请进:此题如何用递归解决??

bg3ak 2002-10-24 12:38:26
设有字符组合abc

得到其所有顺序的组合:
abc
acb
bac
bca
cab
cba
那有n个字符呢??





...全文
36 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bg3ak 2002-10-25
  • 打赏
  • 举报
回复
to:cdspace(寄情楼主)
看明白了,pfpf!!!
不过你的代码有个小bug:只能正确做10以内的组合。
  If Len(sRet) = m Then 不应该用这个作退出条件  :》

to : gcj123(佛的光辉)
   你的代码非常简练:》
   
提高!!!
  感谢!!

bg3ak 2002-10-24
  • 打赏
  • 举报
回复
-------------

递归一般都是用来解决类似树这样有层次结构的问题,这个问题循环是最好的办法

-------------
到也是,
我想,如何写出简练的代码实现这个算法,
不论用任何方法
应该是一个经典的问题了,

希望版主置顶 :》
holydiablo 2002-10-24
  • 打赏
  • 举报
回复
递归一般都是用来解决类似树这样有层次结构的问题,这个问题循环是最好的办法
佛的光辉 2002-10-24
  • 打赏
  • 举报
回复
Public Sub sort(str1 As String, str2 As String, i As Integer, n As Integer)
Dim i1 As Integer
Dim str As String
Dim s As String
str = str2
For i1 = 1 To i
str = str & Mid(str1, i1, 1)
If Len(str) = n Then
List1.AddItem str
Exit Sub
End If
s = Left(str1, i1 - 1)
s = s & Right(str1, Len(str1) - i1)
sort s, str, i - 1, n
str = Left(str, Len(str) - 1)
Next i1
End Sub

str1为原始字符串,str2为已排序字符,i为剩余字符长度,n为中字符长度
如"abc"排序则
sort "abc","",len("abc"),len("abc")
cdspace 2002-10-24
  • 打赏
  • 举报
回复
'楼上那位的什么破代码,且看高手如何表演:
'递归的核心是有个初始函数和一个递归函数
'Text1中放的是参数n,一个List用来保存结果

Private Sub Command1_Click()
BeginCalc Val(Text1.Text)
End Sub

Public Sub BeginCalc(n As Integer)
Dim sRet As String
Dim i As Integer
List1.Clear
'初始化为第一级,空串,总共N级
BeginSub 1, "", n
'用来显示最后的组合数目
Text2.Text = List1.ListCount
End Sub

'递归核心
'nLevel 递归层次
'Last 上一层递归的结果
'n为总的递归层次,即N个字符

Public Function BeginSub(nLevel As Integer, Last As String, n As Integer) As String
Dim i As Integer
Dim sRet As String

For i = 1 To n
sRet = Last
'判断是否已经存在当前字符,如果存在,则放弃递归,即不会出现112,223,333之类的重复组合
If InStr(sRet, Trim(Str(i))) = 0 Then

sRet = sRet & Trim(Str(i))
'如果递归到最后一层
If nLevel = n Then
'只有递归了N次的字符串才是正解
If Len(sRet) = n Then
List1.AddItem sRet
End If
Else
'加一个层次继续递归
BeginSub nLevel + 1, sRet, n
End If
End If
Next i
End Function

' 如果给出如彩票方式的组合,则BeginSub的参数多加一个m 如n=36 m = 7
Public Function BeginSub(nLevel As Integer, Last As String, n As Integer, m As Integer) As String
Dim i As Integer
Dim sRet As String
Dim nStart As Integer
If Last = "" Then
nStart = 1
Else
nStart = Val(Right(Last, 1)) + 1
End If
For i = nStart To n

sRet = Last
If InStr(sRet, Trim(Str(i))) = 0 Then
sRet = sRet & Trim(Str(i))
If nLevel = m Then
If Len(sRet) = m Then
List1.AddItem sRet
End If
Else
BeginSub nLevel + 1, sRet, n, m
End If
End If
Next i
End Function

提高没有,要看不懂,我只好跳楼了
progame 2002-10-24
  • 打赏
  • 举报
回复
上次 Chice_wxg(http://www.myvc.net) 写了一个类似的,PF得一塌糊涂

http://expert.csdn.net/Expert/topic/877/877098.xml?temp=.4453241

可惜我还是没看懂
iceriver521 2002-10-24
  • 打赏
  • 举报
回复
总感觉像什么公司的面试题呢!
tinafang 2002-10-24
  • 打赏
  • 举报
回复
我认为循环的办法也不太方便吧!因为循环的层数在这里不太好确定的。
递归的算法再容我想想

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧