千葉大学 理学研究科 基盤理学専攻 数学・情報数理学コース 2015年8月実施 専門 B11
标签:
Author
祭音Myyura (co-authored with GPT 6 Astra)
Description
次の Scheme 手続きを定義せよ。補助手続きを用いてよい。
(1) リストの長さを返す length。
(2) 整数 と整数リスト に対して、 がなければ #f、あれば最初の から始まる部分リストを返す mem=。例えば (mem= 1 '(3 1 4 1)) は (1 4 1)。
(3) 副作用のない整数値関数 、整数 、非負整数 を受け取り、()となる最小の を返し、そのような組がなければ #f を返す find-loop。
例えば、定数関数 に対して (find-loop f 1 0) は #f、(find-loop f 1 1) は 。 に対する初期値 では 。、初期値 では なら #f、 なら 。
题目描述
用 Scheme 定义以下过程,可使用辅助过程。
(1) length:返回列表长度。
(2) mem=:查找整数,若不存在返回 #f,否则返回从首次出现处开始的子列表。
(3) find-loop:输入无副作用的整数函数 、初值 和非负整数 ,返回满足 、 的最小 ;若无则返回 #f。
例如常值函数 、初值 在 时分别返回 #f,0;、初值 返回 ;、初值 在 时分别返回 #f,8。
Kai
(1)
(define (length l)
(if (null? l) 0 (+ 1 (length (cdr l)))))
(2)
(define (mem= x l)
(cond ((null? l) #f)
((= x (car l)) l)
(else (mem= x (cdr l)))))
先頭から検索するため、最初に一致した位置からの部分リストを返す。
(3)
(define (orbit f x n)
(if (= n 0) (list x)
(cons x (orbit f (f x) (- n 1)))))
(define (scan-loop l i)
(cond ((null? l) #f)
((mem= (car l) (cdr l)) i)
(else (scan-loop (cdr l) (+ i 1)))))
(define (find-loop f x n)
(scan-loop (orbit f x n) 0))
orbit は を順に並べる。scan-loop は の順で、現在の値がそれより後に現れるかを mem= で判定する。従って条件を満たす最小の が返り、全て不一致なら #f が返る。