• 締切済み

だれでもわかるそうです。

ただいま仕事も引退して老後の生活を送っています。 老後の趣味でパソコンを勉強しようと思いschemeをしています。 買った問題集の回答がよくわからないのでここで質問させていただきたいと思います。 だれでもできる簡単問題らしいのでだれか答えてくださると幸いです。 (define (wrap l) (cond ((null? l) (cons l l)) (#t (cons ここになにかをいれろ)))) って問題です。任意のリストlを(l)で返すプログラミングだそうです。 どうかお願いします。ぺこり。 前 あとwを任意のs表現としてS表現のみを要素とする長さ1のリスト(w)を、w,car,cdr,consおよび()を用いて表現できなかったので、だれかヒントをください

みんなの回答

  • root139
  • ベストアンサー率60% (488/809)
回答No.5

穴埋め問題の方ですが、下記の様になれば良いのですよね? (wrap '())  → (()) (wrap '(a b c))  → ((a b c)) 素直に書けば↓になりましたが・・・。 (define (wrap l) (cons l '())) 穴埋めということで、↓になり・・・。(condの意味が無い・・・) (define (wrap l) (cond ((null? l) (cons l l)) (#t (cons l '())))) 無理して再帰を使ったら、↓こんな感じに・・・。 (define (wrap l) (cond ((null? l) (cons l l)) (#t (cons (cons (car l) (car (wrap(cdr l)))) '())))) 全く無駄な処理が増えただけで、再帰や cond は解法を複雑にしているだけとしか思えません・・・。 業務でこんなプログラムが納品されたら、訳が分かってない人間が書いたものだと思うでしょうね・・・。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

京大の基礎情報処理の課題みたいなので、だれでもわかるってのは無理っぽいような。 http://www.math.kyoto-u.ac.jp/~susumu/lecture/kisoj11-report.pdf >あとwを任意のs表現としてS表現のみを要素とする長さ1のリスト(w)を、w,car,cdr,consおよび()を用いて表現できなかったので、だれかヒントをください 古典的な方法として、Lispのデータ構造(セル)を図解してみるとか。 http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=LISP+%E3%82%BB%E3%83%AB%E6%A7%8B%E9%80%A0+%E5%9B%B3&gs_sm=e&gs_upl=651741l658787l0l659464l28l24l4l0l0l3l213l3592l0.22.2l28l0&bav=on.2,or.r_gc.r_pw.,cf.osb&biw=1018&bih=937&wrapid=tlif132771814780710&um=1&ie=UTF-8&tbm=isch&source=og&sa=N&tab=wi&ei=l2EjT-jcJ8uviQfIsrzUBA

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

(2) の方だけど, 「任意のリストlを入力として、(l)を出力とする」という表現もいくつかの解釈が存在します. どのような入力に対してどのような出力を要求しているのですか? しかし, こんなの再帰的になんてしないよなぁ.... (define (wrap . args) args) ってすれば (wrap 'a 'b 'c) => (a b c) じゃなかったっけ.

sksk39
質問者

お礼

おそらく(1 2 3)なら((123))を出力するんだと思います

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

問題を正確に書いてください。

sksk39
質問者

お礼

(1) wを任意のs表現とするとき、このS表現のみを要素とする長さ1のリスト(w)を、w、car,cdr,consと空リスト()から適宜必要なものを選んで組み合わせて表現せよ (2) 任意のリストlを入力として、(l)を出力とするような再帰的関数wrapの定義をせよ (consに二つの引数)を埋めることで完済させろ。 です。できたら解いてみてください

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>だれでもできる簡単問題らしいのでだれか答えてくださると幸いです。 それは、うそですね。数年くらいプログラム経験がある人でも、わからない人は多いと思いますよ。 >>老後の趣味でパソコンを勉強しようと思いschemeをしています。 パソコンの勉強はいいのですが、schemeじゃあなくて、エクセルとかワードとかお絵かきソフトを勉強されるほうがいいのでは?schemeよりも、ずっと役にたつ場面が多いと思いますよ。

sksk39
質問者

お礼

そうですか。本にはサルでもわかると書いてあるのですが…すみません。 この本ぐらい終わらせようと頑張っているのですが・・・中途半端で終わりそうです。 申し訳ありませんでした

関連するQ&A

  • 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について学んでいるのですが、そこで出た問題がわからなくて困っています。 よければ、教えていただけないでしょうか。 問題は以下の通りです。 問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

  • 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を使うべきなのか使わないべきなのかの判断がうまくできません。

  • 落ちてしまいます

    無限ストリームなのですが、 (define (stream-car stream) (car stream)) (define (stream-cdr stream) (force (cdr stream))) (define (cons-stream a b) (cons a (delay b))) (define (integers-starting-from n) (cons-stream n (integers-starting-from (+ n 1)))) (define integers (integers-starting-from 1))      (define (stream-ref s n) (if (= n 0) (stream-car s) (stream-ref (stream-cdr s) (- n 1)))) (define (divisible? x y) (= (remainder x y) 0)) (define (sieve stream) (cons-stream (stream-car stream) (sieve (stream-filter (lambda (x) (not (divisible? x (stream-car stream)))) (stream-cdr stream))))) (define primes (sieve (integers-starting-from 2))) (stream-ref primes 10) integersを定義する段階で落ちてしまうようです。どうも遅延評価がうまくいってないようです。どうしたらよいでしょうか?どなたか助けてください。

  • LISPでatomの数を数える

    XLISPでlistの中のatomの数を数えたいんです。 下のようにlistの中のatomだけを抜き出してリストにすることはできました。 (DEFUN F1(L) (COND((NULL L) NIL) ((LISTP(CAR L))(F1(CDR L))) (T (CONS (CAR L)(F1(CDR L)))) ) ) このコードを実行すると次のようになります。 (F1 '((A B) C D (E F) G)) (C D G) 後はこれをlengthで数えるだけだと思うのですがそのやり方が分かりません。 それとももしかしてSETQで変数を設定して Tのところで値を1つずつ足していくのでしょうか?

  • Shemeで

    Shemeで 関数map1を引数を1つとる関数と リストの2つの引数をとる、簡易版のmapとして定義しなさいという問題で 以下のように考えたのですがうまくいきません。 (define map1(lambda (f l) (if (null? l) (quote()) cons(f (car l) (map1 f (cdr l)))))) ご教授お願いします。

  • scheme でのスコープについて

    次のようなcar,consの定義をします. ;;consの定義 (define (cons x y)  (define (dispatch m)   (cond ((= m 0) x)      ((= m 1) y)      (else (error "Argument not 0 or 1 -- CONS" m)))) ;;carの定義 (define (car z) (z 0)) ここで、 (car (cons 1 2)) を評価したいのですが、次のような置き換えモデルで考えてみました。 (car (cons 1 2)) (car dispatch) ;まず引数を評価 (dispatch 0) ;car を評価して引数に作用させる 1 質問は、dispatchの有効範囲についてです。 dispatchはconsの内部定義なので(cons 1 2)を評価後、carに引数として渡すには,その時点でdispatchが有効でなくなりエラーになると考えたのですが、実際は動きました。 どこがおかしいのでしょうか。環境モデルでも考えてみたのですが分かりませんでした。よろしくお願いします。

  • LISPによる横型探索

    LISPのSchemeをつかって横型探索で探索した経路を出力するプログラムをつくっているのですが、 今は探索が終わると終了するとCLOSEDの中を表示するプログラムしかできていません もしこれに探索した経路の出力をする機能を加える場合どうすればいいですか? OPEN→待ちリスト CLOSED→展開済みリスト GOAL→目標地点 OP→オペレータの集まり nとopから展開の結果をだす (define (tenkai n op) (tenkai2 n op '())) (define (tenkai2 n op kekka) (if (null? op) kekka (if (= n (car (car op))) (tenkai2 n (cdr op) (cons (car (cdr (car op))) kekka)) (tenkai2 n (cdr op) kekka)))) (define (yokogata open goal op closed) (if (null? open) 'sippai (if (= (car open) goal) (display closed) (yokogata (append (cdr open) (tenkai (car open) op)) goal op (append closed (list (car open)))))))

  • 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などが出てきていますがどのような意味なのでしょうか?

  • schmeスキームのプログラミングについて質問です

    listから条件に合わない数を消すfilter1という関数をつくりたいです。 ただ条件があって次のseries関数を使わなければいけません。 (define (reduce op base L) (cond [(empty? L) base] [else (op (first L) (reduce op base(rest L)))])) 自分は以下のような補助関数を含むプログラムを作ったのですが、****の部分をどうすればいいかわかりませんでした。 (define(filter1 rel_op L t) (cond [(empty? L) empty] [(rel_op (first L) t) (reduce f1 0 L)])) (define (f1 L t) (cond [(empty? L) empty] [***** (cons (first L)(rest L))] [else (rest L)])) もしよろしければ回答お願いします。 根本的に間違っているのなら、どのような道筋でプログラムを作るかだけでもいいので教えてください。