[英]check even digits on even positions in number lisp
我需要一个函数来检查偶数位置上某个数字的所有数字是否均是偶数。 最低有效数字在位置1上,从右到左。 该功能需要用Lisp编写。 例子:
245 -> true, since 4 is even
238456 -> false, since 5 is odd and 8 and 2 are even
and so on...
这是我得到的:
(defun check(number fac)
(cond
((= (/ number fac) 0) t)
((= (mod (/ number fac) 2 ) 0) (check number (* 100 fac) ) )
(nil)))
fac
的初始值为10,我们将数字除以10,提取第二个数字,检查是否为偶数,如果是,则将数字除以1000以提取第四个数字,依此类推,直到获得所有数字为止,则该函数将返回true,同时,如果某个数字为奇数,则该函数应返回nil
。 但是出了点问题,例如,当我调用它时(check 22 10)
例如(check 22 10)
,该函数始终返回nil
。
有什么想法吗?
这是一种非递归解决方案,用于检查参数的正确性:
(defun check(num)
(assert (integerp num))
(loop for i = (truncate num 10) then (truncate i 100) until (zerop i)
always (evenp i)))
只是另一个变体。 基本上,我是将数字转换为列表(虽然可能不是通过字符串,但这不是最好的方法),然后反转它,选择第二个元素并检查所有元素是否为偶数。
;; Helper for getting every
(defun get-all-nth (list period)
"Get all NTH element in the list"
(remove-if-not
(let ((iterator 0))
(lambda (x)
(declare (ignore x))
(= 0 (mod (incf iterator) period)))) list))
(defun check-evens (num)
"Checks if all digits in some number on even positions are even.
Goes Rigth-to-left."
(assert (integerp num))
(every #'evenp
(get-all-nth
(reverse
(map 'list #'digit-char-p
(prin1-to-string num))) 2)))
一些测试用例:
CL-USER> (check-evens 123)
T
CL-USER> (check-evens 238456)
NIL
CL-USER> (check-evens 238446)
T
CL-USER> (check-evens 23844681)
T
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.