菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
247
0

Schemer递归

原创
05/13 14:22
阅读数 96357

Schemer符号编程极简语言:讲解递归概念的最佳编程语言

以下尽可能全是大白话,不是大白话请爸爸抽我。

一、各种符号介绍

atom原子:可以是字母、单词、数字、特殊字符及其他组成的字符串(除了"()"符号)
list列表:用括号括起来的原子集合("()是一个列表,叫空列表,但空列表不包含列表,这句话困扰了我很久")
collection集合:去掉括号的列表
所有的原子和列表都是'S-表达式'
car(咔尔)基本元件:列表内第一个'S-表达式',表达式为l = (a b c) (car l) = (a)
cdr(咔哒)基本元件:列表内除了咔尔外的其他'S-表达式'的集合l = (a b c) (cdr l) = (b c)
Ps. l = (a) (car l) = (a) (cdr l) = ()为空列表
cons基本元件:合并一个'S-表达式'到一个列表的第一位,表达式cons a (b xc) = (a b c)
null?基本元件:判断一个列表是否为空列表,表达式(null? x) ,x = (),结果为True。(null?必须且只能判断列表是否为空)
atom?:判断'S-表达式'是否是一个原子,表达式(atom? x),x = abc ,结果为True。
eq?:判断两个非数字的原子是否相同,表达式(eq? a a),结果为True。

二、尝试初级递归^^

lat?:判断列表中每个'S-表达式'是否不包含列表,表达式(l = (a b)) (lat? l)结果为True;(l = ()) (lat? l)结果为True,因为l不包含列表
cond... 为程序定义问题
lambda... 创建一个函数(创建变量)
define... 为函数命名(展示即将使用的函数)

我们来个小例题:
l = (bacon and eggs) 求(lat? l)的结果为?
(define lat?
  (lambda (l)
     (cond
       ((null? l) #t)
      ((atom? (carl))(lat? (cdr l)))
      (else #f)
)))

其结果最终为#t,你算出来了吗?

or... 询问两个及以上问题,有一个问题结果为t,其最终结果即为t。表达式a = (a b c) b = () (or (null? a) (null? b)),结果为t。
member?:确认第一个值是否被第二个值包含。表达式(a = x) (b = (x y z)) (memaber? a b) ,结果为t。

cons构筑恢弘(这狗屁作者在说什么?请原谅我暂时无法理解这个题目)

rember:将一个列表内第一个此原子剔除,如果没有此原子则列表不变。表达式a = (x) b = (z y x q s x z) (rember a b) = (z y q s x z)。

全文引用《The Little Schemer》作者:Daniel P. Friedman 、 Matthias Felleisen

相关热门文章

发表评论

0/200
247 点赞
0 评论
收藏