循环嵌套赋值

oxking_ly 2016-04-10 06:39:50
例如:
Dim wz() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}‘ 定义一个36位数组
Dim sz(10) As String 定义一个10位数组
想让sz数组每位值分别为从0-Z,
即从0000000000-0000000001-zzzzzzzzzz,怎么循环呢?
...全文
202 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qbilbo 2016-04-10
  • 打赏
  • 举报
回复
如果不支持yield,那就这样:
Sub Main()
        PrintString(String.Empty, 0, 10)
        Console.ReadKey()
End Sub

Sub PrintString(str As String, position As Integer, length As Integer)
        Dim wz() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
        For i As Integer = 0 To UBound(wz)
            Dim result = str + wz(i)
            If position = length - 1 Or position = UBound(wz) Then
                Console.WriteLine(result)
            Else
                PrintString(result, position + 1, length)
            End If
        Next
End Sub
不用递归,写十层for next其实也行
sp1234_maJia 2016-04-10
  • 打赏
  • 举报
回复
除了开发工具升级修复之外,另外,我要说一下,vs2015社区版对于小公司和个人是免费的。我相信你如果用的是vs2010,很可能是盗版的。为什么不改为使用vs2015社区版呢?
  • 打赏
  • 举报
回复
yield(迭代器)是vb11的特性,随vs2012而发布。 上面的测试程序,如果发布目标.net平台为3.0以下,可能会没有 tolist 函数,所以不能编译通过(你需要自己写一个tolist函数,就能编译了)。而在3.5以上平台,都能编译通过,只要你使用 vs2012 以上版本开发工具、且.net 目标平台是3.5以上,就能支持 yield。 我们实际开发中,早就使用 vs2015,应用编译发布的 .net 目标平台是 4.5 以上。
  • 打赏
  • 举报
回复
引用 6 楼 oxking_ly 的回复:
[quote=引用 4 楼 sp1234 的回复:] 这个结果是非常巨大的。给你写一个简化、可用来测试的版本
Module Module1

    Sub Main()
        Dim wz() As String = {"0", "1", "2", "a", "b", "c"}
        Dim cnt As Integer
        For Each r In 组合(wz, 3)
            Dim x = String.Join(String.Empty, r.ToArray)
            cnt += 1
            Console.WriteLine("{0}:{1}", cnt, x)
        Next
        Console.WriteLine(".....按任意键结束")
        Console.ReadKey()
    End Sub

    Public Iterator Function 组合(wz As String(), count As Integer) As IEnumerable(Of List(Of String))
        If (count <= 0) Then
            Yield New List(Of String)
        Else
            For Each k In 组合(wz, count - 1)
                For Each w In wz
                    Dim u = k.ToList
                    u.Add(w)
                    Debug.Assert(u.Count = count)
                    Yield u
                Next
            Next
        End If
    End Function

End Module
你可以看到,6个字符,会得到 216 个结果。
你好,系统不认yield啊,第一次见这个[/quote] 这需要vs2012版本。你不会是4年之内都没有升级过 vs 系统吧?
  • 打赏
  • 举报
回复
上面的“组合”方法,你可以看到,其代码是很简单的,而且逻辑也很简单,就是一个递归嵌套而已。跟你遍历一个“树形”结构等等算法,或者任何一个刚学编程的学生学习“hanoi塔算法”,也是一样的意思。如果你当初没有学好递归,可以复习一下。 这里,计算输出的结果是关于“List<string>”对象的枚举。而,要得到一个count个单元的List<string>对象,首先得到一个count-1 个单元的对象,然后把最后一个单元(string)追加给List,就能得到 count 个单元的 List。
oxking_ly 2016-04-10
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
这个结果是非常巨大的。给你写一个简化、可用来测试的版本
Module Module1

    Sub Main()
        Dim wz() As String = {"0", "1", "2", "a", "b", "c"}
        Dim cnt As Integer
        For Each r In 组合(wz, 3)
            Dim x = String.Join(String.Empty, r.ToArray)
            cnt += 1
            Console.WriteLine("{0}:{1}", cnt, x)
        Next
        Console.WriteLine(".....按任意键结束")
        Console.ReadKey()
    End Sub

    Public Iterator Function 组合(wz As String(), count As Integer) As IEnumerable(Of List(Of String))
        If (count <= 0) Then
            Yield New List(Of String)
        Else
            For Each k In 组合(wz, count - 1)
                For Each w In wz
                    Dim u = k.ToList
                    u.Add(w)
                    Debug.Assert(u.Count = count)
                    Yield u
                Next
            Next
        End If
    End Function

End Module
你可以看到,6个字符,会得到 216 个结果。
你好,系统不认yield啊,第一次见这个
  • 打赏
  • 举报
回复
对于你的问题,就是调用算法时写
Dim wz() As String = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
Dim cnt As Integer
For Each r In 组合(wz, 10)
     ......................
  • 打赏
  • 举报
回复
这个结果是非常巨大的。给你写一个简化、可用来测试的版本
Module Module1

    Sub Main()
        Dim wz() As String = {"0", "1", "2", "a", "b", "c"}
        Dim cnt As Integer
        For Each r In 组合(wz, 3)
            Dim x = String.Join(String.Empty, r.ToArray)
            cnt += 1
            Console.WriteLine("{0}:{1}", cnt, x)
        Next
        Console.WriteLine(".....按任意键结束")
        Console.ReadKey()
    End Sub

    Public Iterator Function 组合(wz As String(), count As Integer) As IEnumerable(Of List(Of String))
        If (count <= 0) Then
            Yield New List(Of String)
        Else
            For Each k In 组合(wz, count - 1)
                For Each w In wz
                    Dim u = k.ToList
                    u.Add(w)
                    Debug.Assert(u.Count = count)
                    Yield u
                Next
            Next
        End If
    End Function

End Module
你可以看到,6个字符,会得到 216 个结果。
oxking_ly 2016-04-10
  • 打赏
  • 举报
回复
是否可以输出象这种v3jbovjmmjmyj8o9格式的数字?
oxking_ly 2016-04-10
  • 打赏
  • 举报
回复
引用 1 楼 xianfajushi 的回复:
http://blog.csdn.net/xianfajushi/article/details/50835100
看不懂你的内容

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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