zoukankan      html  css  js  c++  java
  • 交换函数的陷阱——VB2005

      在编程的一些算法中,交换函数虽然不起眼,但也是一个不可或缺的组成部分。少了它,很多算法就难以为继。交换函数定义就是交换两个变量的值。有一点编程基础的人都能很快速的写出代码来。

      Public Shared Sub SwapNumber(ByRef N1 As Integer, ByRef N2 As Integer)

        Dim I As Integer

        I=N1

        N1=N2

        N2=I

      End Sub

      这一段代码只写了Integer型的函数,其它类型的类似。

      但是,这个函数效率不高,额外的利用一个中间变量I。

      有人,利用Xor运算的回复性,写了下面一段代码来

      Public Shared Sub SwapNumber(ByRef N1 As Integer, ByRef N2 As Integer)

        N1 = N1 Xor N2

        N2 = N1 Xor N2

        N1 = N1 Xor N2

      End Sub

      测试一下这个函数

        N=6

        M=7

        SwapNumber(N,M)

      嗯,结果满意。N和M的值的确交换了。

      但是这个函数有一个陷阱,不注意的话,会产生一个严重的逻辑错误。

      用下面的测试

        N=6

        SwapNumber(N,N)

      从需要来看。N和N交换,N的值应该还是6

      可是实际的结果令人瞠目,N=0。为何?

      关键是ByRef这个关键字,他引用的是变量的地址。在调用SwapNumber(N,N)这个函数的时候,N1和N2都引用N这个变量。当N1或者N2值发生改变的时候,N1、N2、N这三个变量是一起变化的。那么在第一行的时候,N1 = N1 Xor N2。实际执行的是N1=6 Xor 6=0,同时,N2的值也发生了变化,N2=0,因为N1和N2指向同一个变量。那后面就很好的理解了。最后退出函数的时候,N就是N1就是N2等于0

      怎么解决?在代码中加一行,遇到值相等的时候,就直接退出函数。因为这个时候,换与不换是一样的。

            Public Shared Sub SwapNumber(ByRef N1 As Integer, ByRef N2 As Integer)

                If N1 = N2 Then Exit Sub

                N1 = N1 Xor N2

                N2 = N1 Xor N2

                N1 = N1 Xor N2

            End Sub

      在很多的书本与网页上讲到本算法的时候,都不会提到这个“陷阱”,那是因为在不同的编程语言中,这个陷阱是不一定出现的。我们看了一个算法,用自己的所熟悉的语言去实现它的时候,一定要做全方位的测试,要找到各个方面的陷阱,不要生搬硬套,以免产生严重的逻辑错误。

    作者:万仓一黍
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    tornado简单的验证码
    python分页和session和计算时间差
    初始tornado框架
    Jquery小实例
    DOM+Javascript一些实例
    Javascript
    CSS拾遗+技巧集合
    css样式基础
    KVM NAT网络模式配置
    Ultimate guide to learning AngularJS in one day
  • 原文地址:https://www.cnblogs.com/grenet/p/1625059.html
Copyright © 2011-2022 走看看