【发布时间】:2020-11-02 17:36:47
【问题描述】:
我有一个整数,我想将它分成一个大小尽可能相等的整数“桶”列表。 一些例子:
- 将 10 除以 2 应该会给我一个列表,如“[ 5; 5 ]” (5+5=10),或者,
- 将 20 除以 3 应该会给我一个列表,如“[ 7; 7; 6 ]” (7+7+6=20),或者,
- 将 15 除以 4 应该会给我一个列表,如“[ 4; 4; 4; 3 ]” (4+4+4+3) 之类的。
较大的bucket是在末端还是中间还是混入都没有关系——它是划分一个进程并发处理,顺序无关紧要。
我写了一些代码,看起来还可以,但看起来太乱了,很难推理:
let integerBuckets total divider =
match total, divider with
| 0, _ -> [ 0 ]
| 1, _ -> [ 1 ]
| _, 0 -> [ total ] // Should never happen, but checked just in case.
| _, 1 -> [ total ]
| _ ->
let result = (double total) / (double divider)
let remainder = total % divider
[ for _ in 0 .. (remainder - 1) -> int (ceil result) ]
@ [ for _ in 0 .. (divider - remainder - 1) -> int (floor result) ]
integerBuckets 15 4
我真的不喜欢 for 循环中的数学;很容易出错和/或意外更改。但我不确定的不仅仅是数学。
谁能给我一些指导,告诉我如何将它“整理”成更容易阅读的更好的 F#?
我不是要求某人提供更好的代码 sn-p,而是要求我指出我应该研究的领域,以便自己学习使代码变得更好。
【问题讨论】:
-
不确定你在第二部分要做什么,但你可以在同一个表达式
match total,divider with | 0,0 ->中同时匹配总计和除数,这会缩短一点 -
感谢您提及@onemorecupofcoffee。按照您的建议进行重构向我展示了一个已经(我希望)纠正的逻辑缺陷。我已经根据需要更新了上面的代码。代码的其余部分是计算“桶”的部分,是我想要建议的主要内容。