• ベストアンサー

Schemeでのリスト操作

'(1 2 3 4 5 6 7 8 9 10), N=3の場合 '((1 2 3) 4 5 6 7 8 9 10)または'((1 2 3) (4 5 6 7 8 9 10)) を返す関数を書きたいのですが、やり方がわかりません。 具体的に言うとあるリストXの最初のN個の値をリストとして括って返す関数です。 '(4 5 6 7 8 9 10 (1 2 3))のやり方ならわかるのですが・・・。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

;;; doを使ってこう言う手もあります。 (define (foo n x)  (do ((m n (- m 1))     (y x (cdr y))     (z '() (cons (car y) z)))    ((zero? m) (cons (reverse z) y)))) ;;; 実行例 > (foo 3 '(1 2 3 4 5 6 7 8 9 10)) ((1 2 3) 4 5 6 7 8 9 10) ;;; 結果は同じですね。

その他の回答 (2)

回答No.2

;;; コード例: (define (foo n x)  (let loop ((m n) (y x) (z '()))   (if (zero? m)     (cons (reverse z) y)     (loop (- m 1) (cdr y) (cons (car y) z))))) ;;; 実行例 > (foo 3 '(1 2 3 4 5 6 7 8 9 10)) ((1 2 3) 4 5 6 7 8 9 10)

回答No.1

Schemeには慣れていないのでどんくさいコードになっているかもしれないけど,手元のGauche v0.8.14では (define (hoge args n) (define (fuga arg1 arg2 x) (if (> x 0) (fuga (cdr arg1) (cons (car arg1) arg2) (- x 1) ) (cons (reverse arg2) arg1 ) ) ) (fuga args '() n ) ) (hoge '(1 2 3 4 5 6) 3) ==================== で ((1 2 3) 4 5 6) となった。 arg1 を (cons arg1 '()) としたら ((1 2 3) (4 5 6)) が得られた。

関連するQ&A