2011-06-10 16 views
5

ile sayılar üretmek için akımı kullanılarak daha iyi bir açıklama [1 -2 3 -4 5 -6 7 -8 9 -10 ...]burada kod gibi sayılar üretmek için alternatif işaretler

(define (integers-starting-from n) 
    (cons-stream n (stream-map - (integers-starting-from (+ n 1))))) 

Alternatif işaretler üretme şeklini tam olarak anlamadım. Birisi bana bunu görselleştirmek için bana daha iyi bir açıklama verebilir mi?

Kodu mit-şemasında çalıştırabilirsiniz. Böyle bunun

cevap

7

edelim düşünce:

Çok tamsayılar bir sonsuz akışı oluşturmak, biz böyle bir şey istiyorum

(define (integers-starting-from n) 
    (cons-stream n (integers-starting-from (+ n 1)))) 

Bu yapmak isteyeyim (ile başlayan n = 1): Şimdi

(+1 +2 +3 +4 +5 ...) 

, en ikinci bir yerden tüm unsurları aldığını varsayalım ve onların işareti ters:

(+1 -2 -3 -4 -5 ...) 

üçüncü yer için ve aynı yapalım: Her sonra eğer

(+1 -2 +3 -4 -5 ...) 
(+1 -2 +3 -4 +5 ...) 

Gördüğümüz gibi:

(+1 -2 +3 +4 +5 ...) 

Tekrarla iki kez daha, her zaman bir sonraki yerde başlayan Öğe, tamsayı akışının geri kalanını ekledikten sonra, işaretini ters çevirdikten sonra (akışın geri kalanının işaretini tersine çevirerek), tam olarak istediğiniz şeyi elde edeceğiz - dönüşümlü işaretlere sahip bir tamsayı akışı. Her seferinde 'u - ile akışın geri kalanı üzerinde akıtmanın geri kalanında kullanırız, burada "akışın geri kalanı" sadece (+ n 1)'dan başlayan akışdır.

Hepsini cons-stream ile tamamlayın ve sahip olmalısınız.

+0

teşekkür gibi bir şey arıyor. Tam olarak aradığım şey bu. –

1
(cons-stream n (stream-map - (integers-starting-from (+ n 1))))) 

öncelikle bu cons-stream değeri n ve - ait monadic durumda geçersiz kılmak için olduğu gibi akışın inversiyon olur (stream-map - (integers-starting-from (+ n 1))) değerlendiren değer form, iki şey yapıyor. Böylece alternatif deseniniz. sizi görünen işlev adını itibaren

çok daha bu

(define (integers-starting-from n) 
    (cons-stream n (integers-starting-from (+ n 1))))