Programming Languages B(Coursera / University of Washington) Assignment4

本文主要是介绍Programming Languages B(Coursera / University of Washington) Assignment4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文件已上传到GitHub: 点这里
本次作业需要racket标准库文档:https://docs.racket-lang.org/


Scheme 大法好
天灭过程式 退C保平安
人在做 天在看 赋值语句留祸患
指针乱用天地灭 赶紧重写保平安
诚心诚念SICP好 Scheme大法平安保
众生都为函数来 现世险恶忘前缘
Scheme弟子说真相 教你编程莫拒绝
早日摆脱面向过程 早日获得新生
上网搜“九评丹尼斯·里奇” 有真相


文章目录

    • 小结
    • Assignment

小结

因为这个课的第二部分换成了Racket(看起来和scheme完全一致),所以内容越来越接近sicp了。
所以有很多sicp的经典内容(或者说lisp的优秀特性,但是这部分我觉得这个课讲的更好),比如:

  • 赋值语句的side-effect
  • Lisp原生强大的macro
  • 典中典之lazy evaluation
  • 特殊的procedure衍生的很有用的streams
  • set-cdrset-car
  • consprocedure

但是同时Racket是一个更加现代并且不断演进的语言,所以有很多sicp中没有提到的feature和技巧。
比如:

  • letlet*letrec三种赋值表达式
  • thunk – 形实转换的procedure
  • 使用[] 进行local bindings
  • 一些库函数
  • Delay and Force 记忆化
  • 用表进行记忆化递归求解斐波那契数列
  • Tokenization

Assignment


#lang racket(provide (all-defined-out)) ;; so we can put tests in a second file;; put your code below
;; 1
(define (sequence low high stride)(if (> low high)null(cons low (sequence (+ low stride) high stride))));; 2
(define (string-append-map xs suffix)(map (lambda(x)(string-append x suffix)) xs))
;; 3
(define (list-nth-mod xs n)(cond [(< n 0) error "list-nth-mod: negative number"][(= (length xs) 0) error "list-nth-mod: empty list"][#t (car (list-tail xs (remainder n (length xs))))]))
;; 4
(define (stream-for-n-steps s n)(if (= n 0)null(let ([next (s)])(cons (car next) (stream-for-n-steps (cdr next) (- n 1))))));; 5
(define funny-number-stream(letrec ([helper (lambda (x) (cons (cond [(= 0 remainder x 5) (* -1 x)][#t x]) (lambda () (helper (+ 1 x)))))])(lambda () (helper 1))));; 6
(define dan-then-dog(letrec ([helper (lambda(x) ((let ([tmp (cond [(= x "dog.jpg") "dan.jpg"][#t "dog.jpg"])])cons (tmp) (lambda() (helper(tmp))))))])(lambda () (helper "dog.jpg"))));; 7
(define (stream-add-zero s)(lambda ()(let ([pr (s)])(cons (cons 0 (car pr)) (stream-add-zero (cdr pr))))));;8
(define (cycle-lists xs ys)(letrec ([lenx (length xs)][leny (length ys)])(letrec ([helper (lambda(x) ((let ([tmp1 (remainder lenx x)][tmp2 (remainder leny x)])(cons (cons (car (list-tail xs tmp1)) (car (list-tail ys tmp2)))(lambda() (helper(+ 1 x)))))))])(lambda () (helper 1)))));;9
(define (vector-assoc v vec)(letrec ([f (lambda (x)(if (< x (vector-length vec))(let ([val (vector-ref vec x)])(if (and (cons? val) (equal? v (car val)))val(f (+ x 1))))#f))])(f 0)));;10
(define (cached-assoc xs n)(letrec ([memo (make-vector n #f)][index 0])(lambda (x);;如果能在缓存序列中得到(let ([ans (vector-assoc x memo)])(if ansans (let ([new-ans (assoc x xs)])(begin(vector-set! memo index new-ans)(set! index (remainder (+ index 1) (vector-length memo)))new-ans)))))))

这篇关于Programming Languages B(Coursera / University of Washington) Assignment4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924021

相关文章

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

Accept CS Ph.D. Offer from Stony Brook University,去SUNY石溪大学的CS Ph.D.啦

前言:在2017年3月24日,正式决定去纽约州立大学石溪分校(State University of New York, Stony Brook,简称石溪大学),CS Ph.D. 项目。本科直博,DIY申请,全额奖学金,第一年5.1万美元(免学费2.2万,2017 fall, 2018 spring 的TA 1.93万,2018 summer RA 1万,没有 Fellowship) Abs

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算

Nordic Collegiate Programming ContestNCPC 2021

Date:October 9, 2021 Dashboard - 2021-2022 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2021) - Codeforces Problem - C - Codeforces--Customs ControlsProblem - C - Codeforces- 题意:给定一个n个点,m条边

纪念一下自己的Coursera Princeton Algorithm的课程第一个assignment

今天终于完成了第一个Union-Find的assignment,之前觉得特别的难,可是最后自己也搞定了。而且是100%满分。 自己后来plot了一下自己的分数,也许这就是学习曲线吧。刚开始不会,到后来中期显著提高,但是要到100%,那就要经历更多的波折,甚至是下降都有可能。最后才能达到100%满分。 我觉得最有用的还是下面这段源代码: /*************************

2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/规律)

解题报告 两人轮流取球,大的人赢,,, 贴官方题解,,,反正我看不懂,,,先留着理解 关于费马小定理 关于原根 找规律找到的,,,sad,,, 很容易找到循环节为p-1,每一个循环节中有一个非零的球,所以只要判断有多少完整循环节,在判断奇偶,,, #include <iostream>#include <cstdio>#include <cstring>

强化学习实践(二):Dynamic Programming(Value \ Policy Iteration)

强化学习实践(二):Dynamic Programming(Value \ Policy Iteration) 伪代码Value IterationPolicy IterationTruncated Policy Iteration 代码项目地址 伪代码 具体的理解可以看理论学习篇,以及代码中的注释,以及赵老师原著 Value Iteration Policy Itera

SAP CAP(Cloud Application Programming)知识介绍和学习路径

1. 框架简介 1.1 什么是CAP? CAP(Cloud Application Programming)是SAP推出的一种现代化开发框架,旨在简化和加速云原生应用程序的开发。 CAP框架基于开放标准和技术,如Node.js、Java、OData和SQL,提供了一套工具和库,帮助开发人员快速构建、扩展和运行企业级应用。 1.2 CAP的基础技术框架 CAP框架主要由以下几个部分组成: