Haskell中case of结合sort实现三角形判定的逻辑疑问
两种
isTriangle实现的等价性说明 两种写法逻辑完全一致,基于sort+case of的实现是利用排序后的大小特性,简化了冗余的条件判断。
原理推导
调用Data.List.sort对三个边长排序后,得到的是从小到大排列的三元素列表,通过case of模式匹配绑定的三个变量满足 min ≤ middle ≤ max。
三角形构成需要的三个判断条件中,有两个是必然成立的:
min + max > middle:max本身就大于等于middle,加上正整数min后肯定大于middlemiddle + max > min:两个不小于min的正整数相加,结果必然大于min
唯一需要校验的只有min + middle > max这一个条件,只要该条件成立,另外两个条件自动满足,等价于你写的三个判断逻辑做与运算。
case of的作用
这里的case of只是做常规的列表模式匹配:
import Data.List (sort) isTriangle :: Int -> Int -> Int -> Bool isTriangle a b c = case sort [a,b,c] of [min, middle, max] -> (min + middle) > max
因为输入固定是三个边长,排序后的列表永远是三元素结构,所以模式匹配不会失败,直接把排序后的三个值绑定到对应变量后做判断即可。
内容的提问来源于stack exchange,提问作者Pastilhas
相关产品推荐
相关产品推荐

