【发布时间】:2020-01-06 14:50:09
【问题描述】:
我尝试用car和cdr的原始工具解决twoSum问题
给定一个整数数组,返回两个数字的索引,例如 它们加起来就是一个特定的目标。
您可以假设每个输入都只有一个解,并且 您不能两次使用相同的元素。
例子:
给定 nums = [2, 7, 11, 15],目标 = 9,
因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]。
想法是从nums 中获取x,然后检查x 的补码(目标-x)是否是集合nums-x 的成员
关键逻辑是
if ((memberp complement (remove-first x nums))
then (list x complement))
从辅助函数try nums开始
(defun two-sum (nums target)
(try nums))
主要功能:
(defun try (nums)
(let ((x (car nums))
(complement (- target x)))
(cond
((null x) '())
((memberp complement (remove-first x nums))
(list x complement))
(t (try (cdr nums)))
)))
然后我意识到((memberp complement (remove-first x nums)) 中的 nums 应该保持不变并且独立于 let 的本地范围。
怎么会得到这样的数字?
memberp 和 `remove-first'
(defun remove-first (item sequence)
(filter (lambda (x) (not (= x item)))
sequence))
(defun filter (predicate sequence)
(cond ((null sequence) nil)
((funcall predicate (car sequence))
(cons (car sequence)
(filter predicate
(cdr sequence))))
(t (filter predicate
(cdr sequence)))))
(defun memberp(item x)
(cond ((null x) 'false)
((equal item (car x)) x)
(t (memq item (cdr x)))))
【问题讨论】: