遇到一个问题,抽象如下图所示:
问题:
- 上图左侧是否无法用流程控制编写?写了一段伪码1如下方所示,发现无法实现。刚又突发奇想,写了伪码2,感觉应该能实现。
- 上图左侧的逻辑是否可以用右侧等效?
- 不使用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是否过大?”。
当然可以直接写出不用 GOTO 的代码,如果觉得没思路就先用 GOTO 还原控制流,然后改成循环+break/continue。
我写的不是伪代码哦,复制到 julia 的 REPL 里可以运行。
性能问题空口无凭,按实际使用的压力测试一下,看看瓶颈在哪里。
例如不等价的问题:
julia> gen_alpha(200)
50.0
julia> gen_alpha2(200)
100.0
IDEA 有社区版。
(我觉得流程图中的赋值框多余的。放大缩小和赋值完全可以合并到一起。
- U’r right .右图确实存在你说的那个漏洞
- 之前写C的实时嵌入式程式时,要求尽量少用判断语句完成任务,是一项公司要求的编程规范。当然性能还是要压力测试的。
- 赋值框是多余的,仅为了画出的图像好看增加的
- 将你的程序修改了一下,写出了左图中一个判断比较少的语句如下:
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