us某大学cs专业的几道课后作业

2021年9月26日      作者:Jack Hsu

最近拿到了us某大学cs专业的课后作业,尝试了,顺利完成。

当然了,我这个学土木搞土木的外行,能完成cs专业的课后作业,也是有原因的,因为这些作业要求用lisp语言来完成。不少朋友都知道,传统上us的高校使用的教学语言是lisp或scheme,近些年有些学校转而采用python,不过,老派一点的学校或者老师仍然还在使用lisp教学。

拿到的题目有6道,都不是很复杂的问题,不过,要是没有任何编程方面的基础,仅凭课堂听讲的话,恐怕完成起来会很相当吃力。因为给自己给别人写过一些cad插件,对lisp比较熟悉,花了一点时间很顺利地就完成了。

下面这个图里边就是前3道题目:

exercise1-3.JPG

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

allowed-functions.JPG

第1题,是找出列表中数值大小介于前后2个数之间的数,返回符合条件的数的个数。下面是我给出的代码:

(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个数之间的数,区别在于返回值不同,要求返回符合条件的数。下面是我给出的代码:

(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次的数,要求返回符合条件的数的个数。下面是我给出的代码:

(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语言就天然地意味着需要运用递归来解决问题,对于递归也是一个很好的练习。

标签: lisp 插件 作业

发表评论:

Copyright© 2009-2021 95ie.com. All Rights Reserved.
powered by emlog