最近拿到了us某大学cs专业的课后作业,尝试了,顺利完成。
当然了,我这个学土木搞土木的外行,能完成cs专业的课后作业,也是有原因的,因为这些作业要求用lisp语言来完成。不少朋友都知道,传统上us的高校使用的教学语言是lisp或scheme,近些年有些学校转而采用python,不过,老派一点的学校或者老师仍然还在使用lisp教学。
拿到的题目有6道,都不是很复杂的问题,不过,要是没有任何编程方面的基础,仅凭课堂听讲的话,恐怕完成起来会很相当吃力。因为给自己给别人写过一些cad插件,对lisp比较熟悉,花了一点时间很顺利地就完成了。
下面这个图里边就是前3道题目:

编程方面的要求就是只能使用如下的operator(操作符、函数),当然,有个例外,就是可以使用if。

第1题,是找出列表中数值大小介于前后2个数之间的数,返回符合条件的数的个数。下面是我给出的代码:
1
2
3
4
5
6
7
8
9
10
11
|
(defun count_between (lst)
(defun _betw (lst2)
(if
(or (and (< (car lst2) (cadr lst2)) (> (caddr lst2) (cadr lst2)))
(and (> (car lst2) (cadr lst2)) (< (caddr lst2) (cadr lst2))))
1
0))
(cond
((null lst) 0)
((> 3 (length lst)) 0)
(t (+ (_betw lst) (count_between (cdr lst))))))
|
第2题,和第1题的问题类似,也是找到数值大小介于前后2个数之间的数,区别在于返回值不同,要求返回符合条件的数。下面是我给出的代码:
1
2
3
4
5
6
7
8
9
10
11
|
(defun between (lst)
(defun _betw2 (lst2)
(if
(or (and (< (car lst2) (cadr lst2)) (> (caddr lst2) (cadr lst2)))
(and (> (car lst2) (cadr lst2)) (< (caddr lst2) (cadr lst2))))
(list (cadr lst2))
'()))
(cond
((null lst) '())
((> 3 (length lst)) '())
(t (append (_betw2 lst) (between (cdr lst))))))
|
第3题,是第1、第2题的延伸,参数是两个列表,列表1中的某些数在列表2中出现了不止1次,要求找出在列表2中出现了2次的数,要求返回符合条件的数的个数。下面是我给出的代码:
1
2
3
4
5
6
7
8
|
(defun twice (lst1 lst2)
(defun _count (a lst)
(cond
((null lst) 0)
(t (+ (if (= (car lst) a) 1 0) (_count a (cdr lst))))))
(cond
((null lst1) 0)
(t (+ (if (= 2 (_count (car lst1) lst2)) 1 0) (twice (cdr lst1) lst2)))))
|
其余3个题目,难度和要求跟这3道题目类似,代码就不贴出来了。这些题目,难度适中,能很好地锻炼编程思维和动手能力,更为关键的是,运用lisp语言就天然地意味着需要运用递归来解决问题,对于递归也是一个很好的练习。
文章作者
Jack Hsu
上次更新
2021-09-26
许可协议
Copyright © Jack Hsu. All Rights Reserved.