图像中左右两侧逻辑是否一致?

遇到一个问题,抽象如下图所示:

问题:

  1. 上图左侧是否无法用流程控制编写?写了一段伪码1如下方所示,发现无法实现。刚又突发奇想,写了伪码2,感觉应该能实现。
  2. 上图左侧的逻辑是否可以用右侧等效?
  3. 不使用Juno怎么调试?有其它调试的IDE吗?
伪码1:
1: while alpha过大
2:          缩小alpha
3:          continue
4:          if alpha 过小
5:                   放大alpha
6:          else
7:                  break
8:          end
9: end

伪码2:
1 : while true
2 :     if alpha过大
3 :          缩小alpha
4 :          continue
5 :     end
6 :     if alpha 过小
7 :          放大alpha
8 :          continue
9 :     end
10:    break
11: end

首先,不等价

你缩小 alpha 之后有可能 alpha 依旧过大。按右侧的逻辑此时就会得到 alpha 了。

(有写不出来的控制流?GOTO 笑了。


too_big(alpha)      = alpha >= 100
too_small(alpha)    = alpha <= 0
not_in_range(alpha) = too_big(alpha) || too_small(alpha)

# 左侧逻辑
function gen_alpha(alpha=10)
    while not_in_range(alpha)
        if too_big(alpha)
            alpha = alpha / 2 # 缩小 α
            continue
        elseif too_small(alpha)
            alpha = alpha + 1 # 增加 α
            continue
        else
            break # 满足要求
        end
    end
    alpha
end

# 右侧逻辑
function gen_alpha2(alpha=10)
    while not_in_range(alpha)
        if too_big(alpha)
            alpha = alpha / 2 # 缩小 α
        end
        if too_small(alpha)
            alpha = alpha + 1 # 增加 α
            continue
        else
            break
        end
    end
    alpha
end

IDE 还有 VSCode 和 IDEAJ 都有插件,至于好不好用,我最近没试过。

  • 右侧放大alpha之后又要重新判断alpha是否过大的,因此右侧逻辑上输出alpha的条件是alpha既不过大,也不过小。
  • 你写出的伪码是可以实现的,但是要首先判断区间,然后如果不在还要判断是大了还是小了才能决定变量是放大或缩小。基于过多的判断会影响程序的性能,而且造成有类似的重复逻辑,所以我期望用右侧的逻辑图等价能够减小判断,提高性能。
  • GOTO是可以在小的程序区间里随意跳转,但是不是一个好的编程习惯,要求严格的编码规范都是禁止使用的。
  • VS Code前不久调了一下调试用着还不错,IDEAJ有版权没试过,比较期望Sublime Text3或4上也能有Debug功能(比VS Code启动快的太多) :joy:

我指的是第一个判断“alpha是否过大?”。

当然可以直接写出不用 GOTO 的代码,如果觉得没思路就先用 GOTO 还原控制流,然后改成循环+break/continue。

我写的不是伪代码哦,复制到 julia 的 REPL 里可以运行。
性能问题空口无凭,按实际使用的压力测试一下,看看瓶颈在哪里。

例如不等价的问题:

julia> gen_alpha(200)
50.0

julia> gen_alpha2(200)
100.0

IDEA 有社区版。

(我觉得流程图中的赋值框多余的。放大缩小和赋值完全可以合并到一起。

  • U’r right :+1:.右图确实存在你说的那个漏洞
  • 之前写C的实时嵌入式程式时,要求尽量少用判断语句完成任务,是一项公司要求的编程规范。当然性能还是要压力测试的。
  • 赋值框是多余的,仅为了画出的图像好看增加的 :sweat_smile:
  • 将你的程序修改了一下,写出了左图中一个判断比较少的语句如下:
julia> too_big(alpha) = alpha >= 100.0;

julia> too_small(alpha) = alpha <= 0.0;

julia> function getAlpha(alpha_ = 10.0)
           while true
               if too_big(alpha_)
                   alpha_ /= 2;
                   continue
               end

               if too_small(alpha_)
                   alpha_+=1;
                   continue
               else
                   break
               end
           end
           return alpha_;
       end
getAlpha (generic function with 2 methods)

julia> getAlpha(200)
50.0

julia> getAlpha(-32)
1

julia> getAlpha(40)
40