• 締切済み

Shemeで掛け算の関数

Shemeで掛け算の関数 関数muliを定義しなさい。ただしzero,inc,dec,add,mulはすでに定義されて、 muliはmulの中から(mulli x y (zero))と呼ばれる。 なんとなくわかるかもしれませんが、 (define (dec n) (cdr n)) (define (zero) (quote())) (define (add x y) (if (null? y) x (add (inc x) (dec y)))) となっています。 この問題で (define muli (lambda (x y n) ((if (null? y) n (muli x (dec y) (add n x)))))) と考えたのですがうまくいきません。 ご教授よろしくお願いします。

みんなの回答

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

とりあえず, 単に「うまくいかない」とだけ書くのはやめてください. ちょっと考えれば, 「質問をしているということは何かうまくいかないことがあるんだろうな」くらいはわかる. で, あなたのいう「うまくいかない」とはどういうこと? どういう入力を与えて, どのような結果が期待されるところ実際に得られた結果はどうだったの? あ, あと「Sheme」じゃなくて「Scheme」ね.

関連するQ&A

  • Shemeで

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

  • 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の使い方を間違っているんでしょうか?

  • Lisp

    Lisp 今リリカルLispをやっているのですが、 詰まってしまって答えがないので困っています。 問題は (s n)を評価すると1+2+・・・+nが返るように関数をsiを定義する(ただしsは次のように定義されている define (s n) (si n 0) ) という問題です。 一応自分なりに考えたのが (define si (lambda (n x) (if (= n 1) (x) (si (- n 1) (+ n x))))) なんですが無限ループのようになるのかこれを実行すると固まって落ちてしまいます。 ご指摘よろしくお願いします。

  • scalaで無限に続く関数を返したい

    scalaで無限に続く関数を返したい scalaという物を知って現在弄り始めた初心者です。 例えばschemeでなら (define f (lambda () (define n (lambda (x) (display x) (display "\n") (lambda () (n (+ x 1))))) (n 0))) (((f))) こんな感じの事がしてみたいですが、これをそのまま下の様に書き換えたところ、コンパイルに失敗しました。 def f()={ def n(x:Int) = { println(x) () => n(x+1) } n(0) } def main(arg:Array[String])={ f()()() } これだと、コンパイラにnが何返すか分からんと怒られてしまいます。単純に返す物が分かっているときは :(()=>Int)= などと書いたら出来たのですが、今回は永遠に終わらないので書き方が分かりません。 どの様に返値を指定すればいいのでしょうか?

  • decの帰納関数としての定義について

    decの定義は通常 dec(0)=0 dec(x+1)=U'2,1'(x,dec(x)) (Uは射影関数) となっていると思いますが、これは dec(0)=0 dec(x+1)=U'1,1'(x) ではまずいのでしょうか。最初のは帰納法を、後者は関数合成を使っていてどちらも帰納関数の定義規則には従っている思うのですが...。 とても初歩的な質問で恐縮なのですが、お詳しい方、お時間ありましたらお答えください。

  • 凸関数

    R^nにあるx,yの内積を<x,y>=x´yとする。 ここでR^nの凸集合Cについて 関数f=sup{<x,y>|y∈C} とすると fが凸関数であることを凸関数の定義を使っても できません。 解けるにはどうやればいいのでしょうか?

  • 関数の問題について。

    nは整数とする。 関数 Xの定義域 n<x<2とするとき、yの値域 0<y<4となるようなnの値をすべて求めなさい。 nの答え、0、-1、-2となりますが、途中の式が分かりません。 すみません、教えてください。 どうぞよろしくお願いいたします。

  • #if

    #if defined(DECRYPTION_KEY_SCHEDULE) #if DEC_ROUND == NO_TABLES #define ff(x) (x) #else #define ff(x) inv_mcol(x) #ifdef dec_imvars #define d_vars dec_imvars #endif #endif 上の部分をコンパイルすると、 'ff'マクロが再定義されました というエラーメッセージが出るのですが、 なぜ再定義になるのか分かりません。  OS:Win2000 コンパイラ VC++ 6.0 以前は、同じようなエラーが出て、 #else を使わないで全て書き直しました。  よろしくお願いいたします。

  • 関数 nの値の求め方

    nは整数とする。 関数y=ax2について Xの定義域 n<x<2とするとき、yの値域 0<y<4となるようなnの値をすべて求めなさい。 nの答え、0、-1、-2となりますが、途中の式が分かりません。 すみません、教えてください。 どうぞよろしくお願いいたします。

  • 落ちてしまいます

    無限ストリームなのですが、 (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を定義する段階で落ちてしまうようです。どうも遅延評価がうまくいってないようです。どうしたらよいでしょうか?どなたか助けてください。