“绿色”整数可以除以2偶数次 换句话说,数字的素数分解中存在偶数个2。
的示例:
•80为绿色,因为它可以被正好四次除以4,而四是偶数 (80 = 2 * 2 * 2 * 2 * 5,5不能被2整除)
•56不是绿色,因为它可以被分成2次正好三次,三次是奇数 (56 = 2 * 2 * 2 * 7,而7不能被2整除)
•15为绿色,因为它可以除以2 0次,零为偶数
我花了很多时间,解决方案简明扼要:
green 0 = error "zero"
green x
| mod x 2 == 0 = not (green (div x 2))
| mod x 2 == 1 = True
我无法想象“not(green(div x 2))”部分的目的。
答案 0 :(得分:0)
这样的事情?
green x = go x 0
where go 0 n = even n
go x n | mod x 2 == 0 = go (div x 2) (n+1)
| otherwise = even n
> zip [1..] $ map green [1..16]
[(1,True),(2,False),(3,True),(4,True),(5,True),(6,False),(7,True),(8,False),(9,True),
(10,False),(11,True),(12,True),(13,True),(14,False),(15,True),(16,True)]
答案 1 :(得分:0)
如果x
可以被2整除,那么mod x 2
可以被2 n-1整除,我们试图找出的是n是偶数。
如果x
是绿色数字,则mod x 2
不是因为如果n是偶数,那么n-1是奇数。
如果x
不是绿色数字,则mod x 2
是绿色数字,因为如果n是奇数,则n-1是偶数。
这种递归关系就足够了,你不需要知道n,你只需知道n是否是偶数,所以这"不是"它之间的切换是偶数还是不是。