2
機能に通常の方法を生成するこのCollatzシーケンスを書いた後:スキル/ラケットでアンフォールドを使用してCollatzシーケンスを書き込む方法は?
(define (colatz-seq #;[email protected] n)
(cond ((= n 1) '())
((even? n) (cons (/ n 2) (colatz-seq (/ n 2))))
((odd? n) (cons (+ (* n 3) 1) (colatz-seq (+ (* n 3) 1))))))
は、私が展開使用して、それを書きたい:
(define (next-colatz-step n)
(cond ((even? n) (/ n 2))
((odd? n) (+ (* n 3) 1))))
(define (one? n)
(= n 1))
(define (colatz-seq #;[email protected] n)
(unfold one? next-colatz-step next-colatz-step n))
をそして、それは予想通りしかし、私はそれをせずに動作させることができなかった作品"next-colatz-step"を2番目と3番目の展開のパラメータとして使用します。どうして? 2つのパラメータに同じ引数を与えるのはちょっと奇妙なようです。
理由ん::このお試しください '()(1つのnを定義 (リスト1))を' がPARAM nとして、それを使用していないにも厳しいがありますか? – X10D
@ X10Dこれは、 'unfold'が最後の引数としてone-arg手続きを期待しているからですが、最後の値が' 1'であることが既に分かっています。しかし、再帰関数 'n' _is_' 1'のその時点でパラメータを使用するように更新しました。 –