• ベストアンサー

schemeのプログラムについて

schemeで同じ長さの2つのリストの要素を交互に並べる関数はどのように書くのでしょうか? 例えば、関数名をabcとして、 (abc '(1 3 5 7 9) '(2 4 6 8 10)) と入力すると (1 2 3 4 5 6 7 8 9 10) のように表示されます

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

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

例えばこんな感じですか? (define (abc ls0 ls1)  (let loop ((ls0 ls0) (ls1 ls1) (acc '()))   (if (= (length ls0) (length ls1))     (if (null? ls0)       (reverse acc)       (let ((a (car ls0)) (b (car ls1)))        (loop (cdr ls0) (cdr ls1)           (if (> a b)             (cons a (cons b acc))             (cons b (cons a acc))))))     (error "リストの長さが違います: " ls0 ls1)))) ;; 実行例 > (abc '(1 3 5 7 9) '(2 4 6 8 10)) '(1 2 3 4 5 6 7 8 9 10) > (abc '(1 3 5) '(2 4)) . . リストの長さが違います: (1 3 5) (2 4) >

cdwkndw
質問者

お礼

ありがとうございます!

関連するQ&A

  • Schemeの質問

    最近Schemeを習い始めたのですがlambdaの概念がよく分かりません。 適当に見つけた例題やらを見ながら、末尾再帰法でリストの中から一番小さい数を表示する関数を書きました。リストが空なら'()を返します。 (define (small List) if (null? List a) '() (small2 List 0))) (define small2 (lambda (list a) (cond ((null? List) a) (or (= head 0) (> head (car List))) (small2 (cdr List) (car List))) (else (small2 (cdr List) a))))) 一応ちゃんと動くのですが、無駄にいっぱい書いている気がします。lambdaを使わない方が短くできるんでしょうか?lambdaを使うべきなのか使わないべきなのかの判断がうまくできません。

  • Schemeについての問題

    今大学でSchemeについて学んでいるのですが、そこで出た問題がわからなくて困っています。 よければ、教えていただけないでしょうか。 問題は以下の通りです。 問1 次に示すScheme プログラムについて以下の問に答えよ。 (define (subtree? t1 t2) (cond ((atom? t1) (eq? t1 t2)) (#t (cond ((atom? t2) #f) (#t (or (and (subtree? (car t1) (car t2)) (subtree? (cdr t1) (cdr t2))) (or (subtree? t1 (car t2)) (subtree? t1 (cdr t2))))))))) 関数subtree?は二つのS 式(S 表現) t1, t2 を入力とし、真偽値(#t あるいは #f) を返す関数である。 関数subtree?が真(#t) を返すための必要十分条件は何であるか答えよ。 また、関数subtree?が実際そのような関数であることをS 式に関する帰納法を用いた議論によって示せ。 考えたのですが、わからなくて。こんな質問してしまって申し訳ないです。 よければよろしくお願いしますm(_ _)m

  • Lispについてわからないことが(Scheme)

    あるLispの勉強ソフトで、 「関数lを『引数としてxを受け取ると、xの要素の数を返す関数』として定義しなさい。」 という問題があるのですが、私は以下のようにしました。 (define l (lambda (x) (if (= x null?) 0 (+ 1 (l (cdr x)))))) しかしこれだとオーバーフローと表示されて強制終了されてしまいました。 そこで答えをネットで検索したところ以下のものが見つかりました。 (define l (lambda (x) (cond ((null? x) 0) (else (+ 1 (l (cdr x))))))) これが正解なようですが、この2つのリストの違いがわかりません。 初歩的なことですがifの使い方を間違っているんでしょうか?

  • schemeのプログラミング

    http://codepad.org/arrsvMiU 上記のページに書かれているschemeのコードなのですが、 letとset!を使わないで同じ動作をするプログラムを書くことは出来るでしょうか? 同じ動作で上二つの関数を使わなければ、中身がガラッと変わっても構いません。 どなたかお願いします このプログラム自体は与えられた式の変数に対して、それぞれのレキシカルアドレス、ポジションを求めてそれを加えて式を返す というものです。

  • 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))のやり方ならわかるのですが・・・。

  • Scheme 中置式から後置式へ

    こんばんは。こちらのカテゴリには初投稿になります。 ただいまScheme習いたて、はじめたばかりの大学一年生です。 二つ、どうしてもわからない問題があります。 問A 中置式リストを後置式リストに変換する関数を定義せよ 問B 後置式の数式リストmとリスト表現のスタックsを受け取り、sを用いてmを実行し、最終のsを返す関数stackMを定義せよ という二問です。 Aに関しては、 ;; revP : list -> list ;; (revP (list 2 * (list 4 - 1)) should return (list 2 4 1 - *) (define (revP l) (cond [(empty? l) empty] [else (cond [(number? (first l)) (cons (first l) (revP (rest l)))] [else ....] まで考えましたが、これでは当然のごとくまったく動きません。。 Bに関して、 ;; stackM : list, list -> list ;; (stackM (list 2 4 1 - *)) should return (list 6) (define (stackM m s) (cond [(empty? m) empty] [(number? (first m)) ] [else....])) と3つに分けるところまではヒントを見てわかったのですが、これから先どうすればいいのかわからないです。。 どなたかできればどうすればいいのかという方針をお教えいただけないでしょうか?かれこれ2時間以上考えていますがまったく出てきません。。 どうかよろしくお願いいたします。 最後に、長文の質問を最後までお読みくださりありがとうございました。

  • schemeで二分探索木の問題について

    schemeの問題で,「二分探索木であることを判定する関数を定義せよ」という問題があります。二分探索木とは,左の部分木に含まれる値はノードの値より小さく,右は大きい二分木です。 頑張って考えたのですが,まったくわかりません。 どなたかご回答をしていただけると助かります。 よろしくお願いします。

  • scheme gaucheに関して

    gaucheで次のプログラムを書きました. ; (define (func lists)  (cond ((null? lists) (cons '() '()))     (else (cons lists (func (cdr lists)))))) このプログラムでは次のような結果を期待していました. gosh> (func '(1 2)) ((1 2) (2) ()) しかし実際には次のような結果になりました. gosh> (func '(1 2)) ((1 . #0=(2)) #0# ()) 他の処理系(Dr.Schemeで行った)で行ったところ, 期待していた通りに実行できたのですが, goucheでは((1 . #0=(2)) #0# ())という結果になってしまいました. この表示の意味するところは何なのでしょうか. #0などが出てきていますがどのような意味なのでしょうか?

  • 線形リストに挿入するプログラム

    連結リストに要素を挿入する関数 insert( ) を関数を定義して,以下の条件の下で整数型の要素を連結リストに挿入するプログラムを作成しなければならないのですが、関数insert部分が見当がつきません. 回答よろしくおねがいします。 条件 1. 関数名を insert( ) とする. 2. 連結リストの先頭ノードを指すポインタ(*head)と,リストに挿入する要素(data)を引数とする. 3. 連結リストの先頭ノードを指すポインタ(*head)からたどって,要素がリスト内で降順(大きいものから小さいものへの順)となる位置に要素を挿入する. 4. 引数で示された要素が既にリストに存在する場合には,要素の挿入は行なわない. #include <stdio.h> #include <stdlib.h> typedef struct __cell { int data; struct __cell *next; } CELL; CELL *insert(CELL *head, int data); void showList(CELL *head); int main(void) { CELL *head; head = NULL; head = insert(head, 5); showList(head); head = insert(head, 2); showList(head); head = insert(head, 6); showList(head); head = insert(head, 4); showList(head); head = insert(head, 6); showList(head); head = insert(head, 4); showList(head); head = insert(head, 1); showList(head); return 0; } CELL *insert(CELL *head, int data) { /*ここで関数 insert( ) を定義します*/ } void showList(CELL *head) { CELL *p; for(p=head ; p!=NULL ; p=(*p).next) { printf("%d -> ", (*p).data); } printf("fin\n"); }

  • 配列に関数るCプログラムの問題

    次の問題の解答をお願いします。 配列tree の各要素を表示するプログラムを作成せよ。配列の各要素は0 から999 の整数である。配列で表示に使用する要素の数Nはキーボードで入力す ること。result(出力例) より下の表示を処理する部分は、関数としてモジュール化し、自 分自身を再帰的に呼び出すよう実装すること。 出力例: N を入力して下さい。 15 tree[15]: 8, 9, 5, 11, 7, 6, 12, 15, 20, 3, 1, 4, 14, 17, 18 result: (ただ "___"の部分はスペースです) __________________15 ____________11 __________________20 ________9 __________________3 _____________7 __________________1 8 __________________4 _____________6 __________________14 ________5 __________________17 _____________12 ___________________18