scheme - 如何在方案 x 中复制列表?
问题描述
我刚刚开始学习 Scheme,使用 cons 对我来说有点困惑。我有一个函数duplicate (s number)
,其中 s 是一个列表,而 number 是列表应该被复制的次数。
如果我输入(duplicate '(1 2) 3)
,输出应该是((1 2) (1 2) (1 2))
我的程序看起来像这样,但是当我运行它时,输出中没有任何内容
(define (duplicate s number)
(cond [(null? s) '()]
[(> 0 number) (cons (list s) (duplicate s(- number 1)))]
))
我在这里做错了什么?
解决方案
我们希望第二个输入n
成为零完成所有列表。我们希望输出是一个列表,所以我们使用cons
.
您可以使用最少的样本来构建代码,而不是添加更复杂的数据。
如果输入是(duplicate x 0)
我们希望输出是'()
。
如果输入是(duplicate x 1)
我们希望输出是'(x)
。
所以你的代码应该是这样的
(define (duplicate x n)
(cond
[(= n 0) '()]
[else
(cons x ...)]))
但是我们已经知道我们想要的输出是'(x)
which is (cons x '())
。很明显'()
是(duplicate x 0)
的输出。所以我们添加(duplicate x (- n 1))
第二个条件。
#lang racket
(define (duplicate x n)
(cond
[(= n 0) '()]
[else
(cons x (duplicate x (- n 1)))]))
;;; TEST
(duplicate '() 0)
(duplicate '() 3)
(duplicate '() 5) ; '(() () () () ())
(duplicate '(1 2) 5) ; '((1 2) (1 2) (1 2) (1 2) (1 2))
或者你可以这样想。我们有员工帮助我们复印文件。
employee-1 :我们给他一个比他减去 1 的数字,而不是命令 employee-2 完成他的工作
员工 2 :他复制文件而不是向员工 3 发送消息
employee-3 :他监督完成与否(数字变为零)。如果未完成,则向员工 1 发送消息。
所以我们想要这样的完成?-> 否 -> 减 1 -> 复制 -> 完成?-> 否 -> 减 1 -> ...
#lang racket
(define x 1)
(define result '())
(define (employee-1 n)
(employee-2 (- n 1)))
(define (employee-2 n)
(begin
(set! result (cons x result))
(employee-3 n)))
(define (employee-3 n)
(if (= n 0)
result
(employee-1 n)))
;;; TEST
(employee-3 3) ; '(1 1 1)
比我们结合employee-1
起来employee-3
(define x 1)
(define result '())
; (define (employee-1 n) (employee-2 (- n 1)))
(define (employee-2 n)
(begin
(set! result (cons x result))
(employee-3-v2 n)))
(define (employee-3-v2 n)
(if (= n 0)
result
(employee-2 (- n 1))))
;;; TEST
(employee-3-v2 3) ; '(1 1 1)
我们使用函数输入替换定义全局变量。所以我们必须删除set!
和更改输入参数。
; (define x 1)
; (define result '())
; (define (employee-1 n) (employee-2 (- n 1)))
(define (employee-2-v2 n x result)
(employee-3-v2 n x (cons x result)))
(define (employee-3-v2 n x result)
(if (= n 0)
result
(employee-2-v2 (- n 1) x result)))
;;; TEST
(employee-3-v2 3 1 '()) ; '(1 1 1)
比我们结合employee-2-v2
到employee-3-v2
. 请记住,我们必须更改输入参数。
(define (employee-3-v3 n x result)
(if (= n 0)
result
(employee-3-v3 (- n 1) x (cons x result))))
;;; TEST
(employee-3-v3 3 'x '()) ; '(x x x)
现在我们要删除不必要的输入参数result
。
(define (employee-3-v4 n x)
(if (= n 0)
'()
(cons x (employee-3-v4 (- n 1) x))))
;;; TEST
(build-list 10 (λ (n) (employee-3-v4 n 'x)))
#|
output:
'(()
(x)
(x x)
(x x x)
(x x x x)
(x x x x x)
(x x x x x x)
(x x x x x x x)
(x x x x x x x x)
(x x x x x x x x x))
|#
推荐阅读
- apollo-client - 如何在生产中使用 apollo 订阅
- c++ - cout 不打印 const 字符串但打印变量
- casting - 我如何使用电报播放 youtube/tv
- gulp - 如何摆脱 Gulp 的“从未定义的任务:默认”?
- r - 使用 R 中的蒙特卡洛模拟股票价格
- swift - iOS 13 Xcode 11:PKPushKit 和 APNS 在一个应用程序中
- python-3.x - python2和python3中用gmpy2计算q,但结果不一样
- android - 用于 RESTFul JSON API 交互的推荐 Android HTTP 库是什么?
- java - RecyclerView 更新而不刷新适配器列表
- java - Firebase RecycleView 与 Edittext 同时进行多项更改