10

Schemeで連続した数字のリストを作成するには?

Python で 1 から 10 までの整数のリストを作成するには、range(1,11). スキームに相当するものはありますか?

mzscheme --version与えるWelcome to Racket v5.2.1.

編集: https://stackoverflow.com/a/7144310/596361ごとに範囲機能を実装するには、次のコードが必要です:

#lang racket
(require srfi/1)
(iota 5 1)
4

7 に答える 7

12

iotaを探します(SRFI-1で定義されているとおり)。

例:(iota 10 1)は、(デフォルトの0の代わりに)1から始まる10個の連続した整数を与えます。

iotaは範囲と同じ引数を取りませんが、すべての機能を複製します-範囲の昇順、範囲の降順、境界が1つしかない場合は0から開始、間隔を指定する機能。

于 2012-10-16T08:16:03.700 に答える
5

Racket には、Python のように動作する組み込みの範囲関数があります。

> (range 10)
'(0 1 2 3 4 5 6 7 8 9)
于 2014-05-24T07:17:30.793 に答える
5

最初の数値が小さい場合は昇順、大きい場合は降順の範囲を実行するバージョンを次に示します。

(define range
  (lambda (n m)
    (cond
      ((= n m) (list n))
        (else (cons n (range ((if (< n m) + -) n 1) m))))))

そして、これは 1 つまたは 2 つの引数を取ることができる改良版です。1 つだけが指定されている場合は、0 から指定された数値までの範囲になります。

(define range
  (lambda (n . m)
    (let
      ((n (if (null? m) 0 n)) (m (if (null? m) n (car m))))
      (cond
    ((= n m) (list n))
    (else (cons n (range ((if (< n m) + -) n 1) m)))))))
于 2012-10-16T09:16:17.560 に答える
3

何も組み込まれていない場合は、独自に作成するのは簡単です。

(define (range first last)
  (if (>= first last)
      '()
      (cons first (range (+ first 1) last))))

オンラインスキーム評価者:http ://eval.ironscheme.net/?id = 71

于 2012-10-16T08:28:32.087 に答える
1

@Ankurのコメントを回答に昇格させています。ラケットでは、「範囲内」があります。

#lang racket

(in-range 7)  ;; produces #<stream>

;; used in a loop:
(for/list ([i (in-range 7)])
  i)
;; produces (list 0 1 2 3 4 5 6)


;; and, for the lazy among us:

(for/list ([i 7])
  i)

;; produces the same

下限、増分(負を含む)などを受け入れることもできます。

于 2012-10-16T16:51:51.100 に答える
0

Germán Diago のコメントに従って、このために純粋な関数型の遅延バージョン (ストリーム) を作成しました。これは、Scheme の実装が一定時間で処理できる任意のサイズの範囲ストリームを構築できるだけでなく、現在の要素にアクセスしてストリームを進めることもできます。

(define ^range
    (lambda (x y getter)
      (op x y getter)))

(define EOS ; End of stream for finite streams
    (^range '() '() (lambda () EOS)))

(define range 
    (lambda (x . y) ; if y < x then stream is infinite
      (let ((x (if (null? y) 0 x))
            (y (if (null? y) x (car y))))
        (^range x y (lambda ()
                      (if (= x y) EOS 
                       (range (+ x 1) y)))))))

(define get ; Get current element
    (lambda (r)
      (r (lambda (x y g) x))))

(define next ; Get stream for next element
    (lambda (r)
      (r (lambda (x y g) (g)))))

このコードの使用:

> (define r (range 1 3))
> (get r)
1
> (get (next r))
2
> (get (next (next r)))
3
> (get (next (next (next r)))) ; EOS
()
于 2018-10-09T09:17:45.447 に答える