检查数字 lisp 中偶数位置的偶数位
Posted
技术标签:
【中文标题】检查数字 lisp 中偶数位置的偶数位【英文标题】:check even digits on even positions in number lisp 【发布时间】:2015-11-29 15:45:11 【问题描述】:我需要一个函数来检查偶数位置上某个数字中的所有数字是否都是偶数。最低有效位在位置 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)
这样调用它时。
有什么想法吗?
【问题讨论】:
【参考方案1】:这是一个检查参数正确性的非递归解决方案:
(defun check(num)
(assert (integerp num))
(loop for i = (truncate num 10) then (truncate i 100) until (zerop i)
always (evenp i)))
【讨论】:
【参考方案2】:只是另一种变体。基本上我正在将数字转换为列表(尽管通过字符串,可能不是最好的方法),然后反转它,选择每个第二个元素并检查它是否是偶数。
;; 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
【讨论】:
以上是关于检查数字 lisp 中偶数位置的偶数位的主要内容,如果未能解决你的问题,请参考以下文章
算法 调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变