检查数字lisp中偶数位置的偶数位数

时间:2015-11-29 15:45:11

标签: numbers position lisp common-lisp digit

我需要一个函数来检查偶数位置上某些数字的所有数字是否均匀。最低位数位于位置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)

有什么想法?

2 个答案:

答案 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