我想找到范围内两个数字之间的差异,但我需要能够环绕范围的开头,就像循环列表一样。
范围是9。
因此,如果数字为6且猜测为5,则答案应为1,但如果数字为8且猜测为2,则答案应为3.
我的第一个想法是将这个数字加上10:
n is the correct number, g is the guess, r is the result.
( let
[ r (min (- (+ n 10) g) (- g n)) ]
(if (> 0 r) ( * -1 r ) r) )
)
......这对于包装很有用,但问题是数字10的存在会使结果增加1。只是从结果中减去1或数字在所有情况下都不起作用。
根据所讨论的数字,结果是否定的,因此if语句是将其交换为正数。
这不完全是一个clojure问题,它确实是一个数学问题,我会在任何语言中遇到这个问题,但它恰好就是我正在编写它。我刚刚开始使用clojure(或任何功能语言),所以我完全可能做错了或非常单一。
感谢您的帮助
答案 0 :(得分:0)
如果你在循环中包含零,则问题变为 A - B mod R或B中的较小者 - A mod R
R = 9
8 - 3 mod 9 = 5
3 - 8 mod 9 = 4
min(5 3) = 3
如果你允许他们猜测数字为零,你可以通过递减你读取的数字并且包含你打印的数字来获得不允许猜测为零的效果,但是如果允许他们猜测数字为零,你的游戏在数学上会更容易。
(defn mod- [x y r]
(let [res (rem (- x y) r)]
(if (neg? res)
(+ res r)
res)))
(min (mod- A B r) (mod- B A r))
答案 1 :(得分:0)
对于案例,如果数字是8且猜测是2 你确定答案应该是3而不是6吗?如果是这样的情况,那么计算差异的以下函数如何:
(defn difference [rrange number-to-guess guess]
(-> rrange
(- guess)
(+ number-to-guess)
(mod rrange)))
以下是测试。
user=> (= 1 (difference 9 6 5))
true
user=> (= 6 (difference 9 8 2))
true