我需要一个函数来检查偶数位置上某些数字的所有数字是否均匀。最低位数位于位置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以提取第4个数字,所以直到我们遍历所有数字,比函数返回true,同时如果某个数字为奇数,则该函数应返回nil
。
但有些事情是错误的,函数一直返回nil
,例如我称之为(check 22 10)
。
有什么想法?
答案 0 :(得分:5)
这是一个非递归解决方案,用于检查参数的正确性:
(defun check(num)
(assert (integerp num))
(loop for i = (truncate num 10) then (truncate i 100) until (zerop i)
always (evenp i)))
答案 1 :(得分:0)
只是另一种变体。基本上我将数字转换为列表(通过字符串,可能不是最好的方式),然后反转它,选择每一个元素并检查它是否均匀。
;; 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