返回

日拱一卒,伯克利教你 Lisp,从 CS61A 作业 8 开始

闲谈

日拱一卒,伯克利教你 Lisp,从 CS61A 作业 8 开始

大家好,日拱一卒,我是梁唐。本文始发于公众号:Coder梁

我们继续来肝伯克利 CS61A,今天我们看的是作业 8。这一次的作业有些特殊,不再是基于 Python,而是一门全新的语言 Lisp。

Lisp 简介

Lisp(List Processor)是一种历史悠久的编程语言,由 John McCarthy 于 1958 年发明。Lisp 以其独特的列表处理能力而闻名,它使用前缀符号表示法,代码具有很强的可读性和灵活性。

Lisp 是函数式编程语言的先驱,它支持 lambda 表达式和递归,非常适合处理复杂的数据结构和算法。Lisp 在人工智能、自然语言处理和符号计算等领域有着广泛的应用。

CS61A 作业 8

CS61A 作业 8 要求学生使用 Lisp 语言编写程序,完成以下任务:

  1. 计算两个整数的乘积。
  2. 计算两个整数的最大公约数。
  3. 使用递归实现阶乘函数。
  4. 使用递归实现斐波那契数列。
  5. 使用递归实现快速排序算法。

Lisp 语法

Lisp 的语法与其他编程语言有很大不同,它使用前缀符号表示法,即函数名写在参数之前。例如,以下代码计算两个整数的乘积:

(* 3 5)

Lisp 中没有变量声明,变量的值可以直接赋值。例如,以下代码将变量 x 的值设为 10:

(setq x 10)

函数式编程

Lisp 是函数式编程语言,这意味着它支持 lambda 表达式和递归。lambda 表达式允许定义匿名函数,递归允许函数调用自身。

以下代码使用 lambda 表达式定义了一个计算两个整数乘积的函数:

(define (multiply x y)
  (* x y))

以下代码使用递归实现阶乘函数:

(define (factorial n)
  (if (= n 0)
    1
    (* n (factorial (- n 1)))))

递归

递归是一种函数调用自身的技术,它非常适合处理具有重复结构的问题。例如,以下代码使用递归实现斐波那契数列:

(define (fib n)
  (if (= n 0)
    0
    (if (= n 1)
      1
      (+ (fib (- n 1)) (fib (- n 2))))))

快速排序算法

快速排序算法是一种高效的排序算法,它使用分治策略将数组划分为较小的子数组,然后递归地对子数组进行排序。

以下代码使用递归实现快速排序算法:

(define (quicksort lst)
  (if (null? lst)
    nil
    (let ((pivot (car lst)))
      (append
        (quicksort (filter (lambda (x) (< x pivot)) (cdr lst)))
        (list pivot)
        (quicksort (filter (lambda (x) (>= x pivot)) (cdr lst)))))))

结语

以上就是伯克利大学 CS61A 课程作业 8 的讲解。通过这个作业,我们学习了 Lisp 的语法、函数式编程和递归等概念。这些概念对于理解 Lisp 语言和函数式编程范式非常重要。

如果您对 Lisp 感兴趣,我强烈建议您尝试完成这个作业。它将帮助您更好地理解 Lisp 的语法和概念,并提高您的编程技能。