求助:一个asp下标越界的问题

bbhigh 2012-07-06 09:50:37
求助:我用asp写了个组合的算法,调试一直出现“ If b(i)=1 And b(i+1)=0 Then ”这段代码出现下标越界,可我想不管怎么算也运算不到最后一个数组,可能是我已经思维定势了,求助大神给我解惑


Function CreateResult(a,b,m)

Dim result
result=""
n=UBound(a)-1
tempTest =""
j=0
For i=0 To n
tempTest = tempTest & "," & b(i)
j=j+1
If b(i)=1 Then
result = result & "+" & a(i)
End If
Next
CreateResult = result

End Function

Function Combination(a,m) '从数组a中选取m个数进行组合
Dim n,list
Dim b()
n = UBound(a)-1
ReDim b(n) '辅助数组。首先初始化,将数组前m个元素置为1,表示第一个组合为m个数

For i=0 To n

If i<m Then
b(i)=1
Else
b(i)=0
End If
Next

list = list & "|" & CreateResult(a,b,m)
tempEnd = "N"

Do While tempEnd ="N"
findFirst = "N"
swap = "N"

For i=0 To n
L=0
'Call JS_AlertBackEnd(i)
If findFirst="N" And b(i)=1 Then
k=i
findFirst = "Y"

End If

If b(i)=1 And b(i+1)=0 Then
b(i)=0
b(i+1)=1
swap = "Y"
If k<>1 Then
For L=0 To i-k
b(L)=b(k+1)
Next
For L=i-k To i
b(L)=0
Next
End If
If k=i And i=n-m Then
tempEnd = "Y"
End If
End If
If swap="Y" Then
Exit For
End If
Next
list = list & "|" & CreateResult(a,b,m)

Loop
Combination = list
End Function
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbhigh 2012-07-06
  • 打赏
  • 举报
回复
谢谢各位的意见,谢谢一楼,出现死循环的主要问题出在 b(L)=b(k+1)这个地方应该改为b(L)=b(L+1)然后添加上一楼的判断条件就OK了,另外我将代码修改了一下,贴出来和大家分享。这个组合算法思路是别人的,我只是将语言变成asp而已

'总体思路:
'组合算法
'本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
'代表的数被选中,为0则没选中。
'首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
'然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为
'"01"组合,同时将其(在本算法中具体指i的位置)左边的所有"1"全部移动到数组的最左端。
'当第一个"1"移动到数组的m-n的位置,即n个"1"全部移动到最右端时,就得
'到了最后一个组合。
'例如求5中选3的组合:
'1 1 1 0 0 //1,2,3
'1 1 0 1 0 //1,2,4
'1 0 1 1 0 //1,3,4
'0 1 1 1 0 //2,3,4
'1 1 0 0 1 //1,2,5
'1 0 1 0 1 //1,3,5
'0 1 1 0 1 //2,3,5
'1 0 0 1 1 //1,4,5
'0 1 0 1 1 //2,4,5
'0 0 1 1 1 //3,4,5



Function Combination(a,m) '从数组a中选取m个数进行组合
Dim n,list
Dim b()
n = UBound(a)
ReDim b(n) '辅助数组。首先初始化,将数组前m个元素置为1,表示第一个组合为m个数
'初始化位运数组,因为asp好像没有位运算,因此添加了一个数组来模拟位运算
For i=0 To n
If i<=m Then
b(i)=1
Else
b(i)=0
End If
Next
b(0)=0
list = list & "|" & CreateResult(a,b,m)
tempEnd = "N"
'初始化结束

Do While tempEnd ="N"
findFirst = "N"
swap = "N"

For i=1 To n
If findFirst="N" And b(i)=1 Then
k=i
findFirst = "Y"
End If
If b(i)=0 And b(i-1)=1 Then
b(i)=1
b(i-1)=0
swap = "Y"
If k<>1 Then
For L=1 To i-k
b(L)=b(L+1)
Next
For L=i-k To i-1
b(L)=0
Next
End If
If k=i-1 And k=n-m Then
tempEnd = "Y"
End If
End If
If swap="Y" Then
Exit For
End If
Next
list = list & "|" & CreateResult(a,b,m)
Loop
Combination = list
End Function
bbhigh 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

For i=0 To n
说明i是从0开始的

If b(i)=1 And b(i+1)=0 Then

这里的b(i+1)=0
这里怎么能=0呢,最小也结果也是1啊
[/Quote]

之前有进行了位数组的初始化,所以这是可能的
zhp258 2012-07-06
  • 打赏
  • 举报
回复
For i=0 To n
说明i是从0开始的

If b(i)=1 And b(i+1)=0 Then

这里的b(i+1)=0
这里怎么能=0呢,最小也结果也是1啊
zhp258 2012-07-06
  • 打赏
  • 举报
回复
你加一下判断就行了,3楼的说的很对
zhp258 2012-07-06
  • 打赏
  • 举报
回复
下标是从0开始的,你加一就多了啊
bbhigh 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

这个当然越界了,你循环到最后一个的时候,再+1不越界也怪

VBScript code
If (i+1)<=n And b(i)=1 And b(i+1)=0 Then '多加一个是否越界的判断
[/Quote]


添加了一个越界判断之后就进入了死循环!这是很头痛的事情,应该是那里的逻辑问题。。。
hookee 2012-07-06
  • 打赏
  • 举报
回复
ReDim b(n) <-- b的下标是0 到n
For i=0 To n <-- 这里 i 是循环到n的, i=n时 i+1必然超过界限
...
If b(i)=1 And b(i+1)=0 Then <----这里 i=n时 就发生了i+1越界
Go 旅城通票 2012-07-06
  • 打赏
  • 举报
回复
这个当然越界了,你循环到最后一个的时候,再+1不越界也怪

 If (i+1)<=n And b(i)=1  And b(i+1)=0  Then '多加一个是否越界的判断

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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