LoginSignup
1
0

More than 5 years have passed since last update.

Scheme手習いメモ (9章 - …もう一度、もう一度、もう一度…)

Posted at

keep-looking

(6 2 4 caviar 5 7 3) のようなリストがあったとき、まず1番目の要素は 6,6番目の要素は 3, 3番目の要素は caviar 。探している要素が caviar かどうか?という風に、順々に要素を辿る関数を定義する。

keep-looking.scm
(define looking
  (lambda (a lat)
    (keep-looking a (pick 1 lat) lat)))

(define keep-looking
  (lambda (a sorn lat)
    (cond
      ((number? sorn)
       (keep-looking a (pick sorn lat) lat))
      (else (eq? sorn a)))))

(define a 'caviar)
(define l '(6 2 4 caviar 5 7 3))
(print (keep-looking a 'caviar l))

shift

第一の要素がペアであるペアを引数にとり、括弧をシフトする関数 shift を定義する。

shift.scm
(define first
  (lambda (p)
    (car p)))

(define second
  (lambda (p)
    (car (cdr p))))

(define build
  (lambda (a1 a2)
    (cons a1 (cons a2 (quote ())))))

(define shift
  (lambda (pair)
    (build (first (first pair))
           (build (second (first pair))
                  (second pair)))))

(define l '((a b) (c d)))
(print (shift l))

出力は (a (b (c d))) となる。

length*

入れ子になったペアに含まれる要素の個数を計算する length* を定義する。

length*.scm
(define length*
  (lambda (para)
    (cond
      ((atom? para) 1)
      (else
        (+ (length* (first para))
           (length* (second para)))))))

collatz

Collatz予想の計算を行う関数。

collatz.scm
(define collatz
  (lambda (n)
    (cond
      (eq? n 1)
      (else
        (cond
          ((even? n) (collatz (/ n 2)))
          (else (collatz (add1 (* 3 n)))))))))

ありがとう Lothar Collatz。

ackermann

Ackermann関数を計算する関数

ackermann.scm
(define ackermann
  (lambda (n m)
    (cond
      ((zero? n) (add1 m))
      ((zero? m) (ackermann (sub1 n) 1))
      (else (ackermann (sub1 n)
                       (ackermann n (sub1 m)))))))

ありがとう Wilhelm Ackermann。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0