当前位置:编程学习 > VB >>

关于递归中途退出的问题

--------------------编程问答-------------------- 你这个根本不需要递归,用循环就可以了,事实上,使用递归是不得已的办法,比如遍历文件数;
--------------------编程问答-------------------- 用循环我还会呢  之所以用递归,就是为了执行速度快
当数据量大的时候循环太慢了! --------------------编程问答-------------------- 递归函数可以使用byref类型的参数,这样可以修改参数,传递给上层调用函数,从而返回多个返回值.

比如递归函数返回的是字符串,并且把参数修改为特殊值,这样上层调用函数检查到这个参数的值变化为特殊值,就结束本层调用,并修改自己的参数回到上层调用.而递归函数的返回值还是可以返回的.


Option Explicit

Private Sub Form_Load()
Dim s As String, i As Long, m As Long
s = "1,3,5,7,9,0"
Debug.Print GetNum(s, 3, False)
End Sub
Function GetNum(ByVal s As String, ByVal num As Long, Flag As Boolean) As String
's 集合,从集合里挑选组合
'num,组合的长度
'flag 标记,true后就不再调用getnum
Dim x, y
Dim ret As String, ret1 As String
'递归调用,先看看参数是不是可以直接返回
If num = 0 Or s = "" Then
    GetNum = ""
    Exit Function
ElseIf num = 1 Then
    GetNum = s
    Exit Function
End If
'集合分解为数组
x = Split(s, ",")
Dim m As Long, l As Long '两个计数变量

For m = 0 To UBound(x) '遍历s中的每个元素
'从s集合剔除一个元素,用剩下的集合去组合

'剔除,小心","的问题
    If m <> UBound(x) Then ret = Replace(s, x(m) & ",", "") Else ret = Replace(s, "," & x(m), "")
'组合,递归调用
    ret = GetNum(ret, num - 1, Flag)
'对返回的结果进行判断
    If Flag = True And ret <> "" Then
        GetNum = ret
        Exit Function
    End If
    If ret = "" Then
        GetNum = ""
        Exit Function
    End If
's中的每个元素与getnum的结果组合,产生需要的长度
    y = Split(ret, ",")
    For l = 0 To UBound(y)
'这个if纯粹是控制","来着
        If ret1 = "" Then
            ret1 = x(m) & y(l)
        Else
            ret1 = ret1 & "," & x(m) & y(l)
        End If
    Next l
    If num = 3 Then 'LZ要求的,3个数字合是4就退出,长度是3才判断,其他时候就不判断了
        y = Split(ret1, ",") '分解现有的组合为数组
'每个元素都判断各位和是不是4
        For l = 0 To UBound(y)
            If Val(Mid(y(l), 1, 1)) + Val(Mid(y(l), 2, 1)) + Val(Mid(y(l), 3, 1)) = 4 Then
                Debug.Print y(l)
                GetNum = ret1
                Flag = True
                Exit Function
            End If
        Next l
    End If
    GetNum = ret1
Next m
End Function
--------------------编程问答--------------------
引用 2 楼 dengpeng_b 的回复:
用循环我还会呢  之所以用递归,就是为了执行速度快
当数据量大的时候循环太慢了!


用递归,执行速度快?
是哪个高人得出的结论?何以见得(比循环快)?
难道看起来语句数量少点,执行就快点么??? --------------------编程问答--------------------
引用 2 楼 dengpeng_b 的回复:
用循环我还会呢  之所以用递归,就是为了执行速度快
当数据量大的时候循环太慢了!


不知道你这个结论怎么得到的
使用递归的问题
1,对于大的递归,可能会栈溢出,并且不可控
2,效率低下,因为每次调用都需要函数调用开销 --------------------编程问答-------------------- 如果是N选M怎么能用循环呀,N和M事先都不能确定
如果M是1000,你要写一千个循环语句吗????!!
所以还得用递归 --------------------编程问答-------------------- --------------------编程问答-------------------- 还是循环吧。简单。快。 --------------------编程问答-------------------- 一般是为了执行速度更快而尽量写到一个函数中啊
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,