- ベストアンサー
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))のやり方ならわかるのですが・・・。
- みんなの回答 (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)
- cametan_42
- ベストアンサー率62% (162/261)
;;; コード例: (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)
- himajin100000
- ベストアンサー率54% (1660/3060)
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)) が得られた。