2012-10-16 16 views

cevap

8

Bak (srfi-1'de tanımlandığı gibi) iotaiçin.

Örnek: (iota 10 1), 1'den başlayarak (0 varsayılanı yerine) 10 ardışık tamsayı verir.

iyota aralığında aynı argüman almaz ancak tüm işlevselliği çoğaltır - artan aralıkları, aralığı azalan tek, aralık belirtmek olanağı verilir sınırın ise 0 ile başlayarak. Yerleşik bir şey yoksa

+0

Uzman değilim, ancak python3 aralığında bir aralık nesnesini döndürür ve jeneratör protokolünü izleyerek bir sonraki işlevle tembel olarak değerlendirir. Görebiliyorum (gecikme (iota 5 1)) yapabilir ve daha sonra kuvvet değerlendirebilir. Sorum şu: Bir kez değerlendirildiğinde, tüm liste bir kerede hafızada mı? Python aralığı ile tam olarak aynı etkiyi elde edebilir mi? Yani, her seferinde bir değeri değerlendirmek. –

3

, yazmak için Önemsiz kendi:

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

Çevrimiçi şeması değerlendirici: Burada

+0

'(önce ilk (aralık ((eğer ( itsbruce

+0

@itsbruce Bu asla sona ermez. – nibot

+0

Evet öyle. Dene. İlk sayı, alttan daha yüksekse veya birincisi daha düşükse yükselen bir aralığa ulaşır. Ah, durumunuzu değiştirmek zorunda kalacaksınız (eğer (= ilk son)) – itsbruce

5

http://eval.ironscheme.net/?id=71 ilk sayı düşük veya bir ise artan bir dizi yapan bir versiyonu yüksekse, azalan aralık:

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

Ve burada 1 veya 2 bağımsız değişken alabilen geliştirilmiş bir sürüm; Sadece bir verilirse, o 0'dan verilen numaraya bir dizi yapar:

(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))))))) 
1

Sadece bir cevaba ANKUR yorumuna @ yükselen ediyorum. Racket olarak, "menzil içinde" vardır:

#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 

Ayrıca (negatif dahil) bir alt sınırını, bir artış kabul edebilir, vb

1

yoktur yerleşik bir Racket içinde range fonksiyonu olduğunu Python'unki gibi davranır.

> (range 10) 
'(0 1 2 3 4 5 6 7 8 9) 
+0

Bunun kabul edilen cevaptan daha iyi olduğunu düşünüyorum. Bir de (gerektirir ...) 'ifadesine gerek yok. –

İlgili konular