(plus1 5) => error 発生

このQ&Aのポイント
  • (plus1 5) でエラーが発生しました。
  • 引数が不正なため、計算を行うことができませんでした。
  • (plus1 5) の結果は得られませんでした。
回答を見る
  • ベストアンサー

(plus1 5) => error 発生

(plus1 5) => error 発生 (plus1 '()) => () (plus1 '(5)) => (6) (plus1 '(1 2 3 7)) => (2 3 4 8) これを満足するのが欲しいです! (define plus1 (lambda (x) このあとどうしたらいいんでしょうか? ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー (min 5) => error発生 (min '()) => error (min '(20 15)) => 15 (min '(30 5 90 25)) => 5 >(define min (lambda (x)

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

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

> (+ (+ 1 (car x))(plus1 (cdr x)))) > したらいいなと思ったんですが > よくできません 引数が空リストでなかった場合の処理を「(+ (+ 1 (car x))(plus1 (cdr x))))」にして実行したらエラーになった、という事でよいでしょうか? 最初の「+」は、残りの要素を処理したリストと最初の要素に1を足したものをつなげたかったのだと思いますが、リストの先頭に値を追加するのは cons です。No.3 サンプルでも cons を使っています。 cons は下記のページに詳しく載っていますよ。 http://www.shido.info/lisp/scheme3.html > 再帰は count, sumまでやったことありますが > これは再帰でできます? いきなり count, sum といわれても何のことか分かりません。 リストの要素数を数えたり、要素の値を全て足したりする関数を以前に作ったのだろうという想像はつきますが。 plus1 も No.3 でも書いたように再帰でできますよ。 自分が分かっている事といない事、相手に伝えた事と伝えていない事などを、ちゃんと整理して考えていないところに、できない原因が有るように思いますよ。

yawara18
質問者

お礼

完成 ありがとうございました (define plus1 (lambda (l) (cond ((null? l) ()) ((list? (car l)) (cons (plus1 (car l)) (plus1 (cdr l)))) (else (cons (+ 1 (car l))(plus1 (cdr l)))))))

その他の回答 (4)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.4

lispどうこうの問題じゃないよ. アルゴリズムの基礎的な部分と 人にものを聞くときにいかに情報を伝えるかの問題だね Haskellで書いておくから自分でlispに直しなよ 何をやってるのかはlispで書くよりも見やすいはず. plus1の方は再帰を使うのが本質 plus1:: [Int] -> [Int] plus [] = [] plus (x:xs) = (x+1):(plus1 xs) min については,やはり再帰なんだけどもfoldlを使ってみよう min1:: [Int] -> Int min1 (x:xs) = foldl (\ x y -> if x<y then x else y) x xs foldlはschemeにも同じようなものがあるはずだけど 要はリストの先頭要素 A をスタートにして リストの残りの先頭 B とを比べて,小さいほうを次のスタートにするということ. 左重ね合わせをつかったけど,右でも同じ. 右の方が効率がいいんだっけか

yawara18
質問者

お礼

thank you

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

map を使うと楽に出来ると思いますが、課題っぽいので、オーソドックスに再帰呼出しを使う方法のヒントを。 (define plus1 (lambda (x) (if (null? x) 要素が無い場合の値 (cons (先頭の要素に1を足した値) (再帰呼び出しを使って残りを処理))))) リストの先頭と残りを取り出すのは、 car と cdr でできますね。 http://www.shido.info/lisp/scheme3.html 先頭の一つを処理して残りを再帰呼出したものと連結するのは典型的な scheme のリスト変換のイディオムですね。 下記のページなどが参考になるかと。 http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3A%E3%81%AA%E3%81%9CScheme%E3%81%AB%E3%81%AFreturn%E3%81%8C%E7%84%A1%E3%81%84%E3%81%AE%E3%81%8B http://practical-scheme.net/docs/tailcall-j.html 下記の本ではこういった問題が非常に丁寧に説明されています。 http://www.amazon.co.jp/dp/0262560992/

yawara18
質問者

お礼

thank you

yawara18
質問者

補足

(+ (+ 1 (car x))(plus1 (cdr x)))) したらいいなと思ったんですが よくできません 再帰は count, sumまでやったことありますが これは再帰でできます?

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.2

そうじゃなくて、plus1 は「関数として」どのように動作することが期待されているのですか?

yawara18
質問者

補足

(plus1 5) => error 発生 (plus1 '()) => () (plus1 '(5)) => (6) (plus1 '(1 2 3 7)) => (2 3 4 8) listの中の数を +1 増やす動作をします (plus1 '()) これの答えが()になる理由は ((null? x) ()) xがnullの時xは() (plus1 5)がerroeになる理由は5はlistではないからですね だからplus1はリストの数を+1増やすことです どうすれば。。。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>このあとどうしたらいいんでしょうか? その前に plus1 の仕様を日本語で説明するのが先です。

yawara18
質問者

補足

LISPの種類 schemeで使う変数です

関連するQ&A

  • 配列upでエラー発生,なぜ?

    初めて質問いたします.私はこれまでFortranは触っていましたが,Cは始めて数ヶ月の初心者です.慣れない点ご容赦ください. (x,y)平面上でp[x][y]があり,p[x][y]は整数を持っています.今現在の数値はx,yは共に100分割しており,p[x][y]自身は1~10のいずれか一つの整数です.これをpの数値も配列にしたいので,ph[k][x][y]に変えようとしています.定義は「#define ND 100」および「#define maxg 24」とした上で,「int p[ND][ND]」と「double ph[maxg][ND][ND]」としています.maxgが24の場合,コンパイルも計算もうまくいきます.しかし,maxgを25に変えるとコンパイルはうまくいくのですが,計算ができず,「問題が発生したため、<プログラム名.exe> を終了します。 ご不便をおかけして申し訳ありません。/エラー報告を送信するorしない」の画面が出てきます.配列を変えただけでエラーがでる理由が分かりません.タスクマネージャーで見る限り,計算中のメモリーにも余裕があるようです.どこに原因があるのか,何を調べるべきか教えてもらえませんか? ちなみにコンパイラーはvisualC++.Net standard 2002を使用しています.ソフト上でメモリーの制限をするような設定か何かがあるのでしょうか?よろしくお願いします.

  • アプリケーションエラーが発生

    ウイルスセキュリティが立ち上がるときに以下のようなアプリケーションエラーが発生するのですが、どうしたら発生しなくなるのでしょうか? 教えてください。  再インストールしても同じでした。 "0x7950e03"の命令が"0x00610070"のメモリを参照しました。メモリが"writen"になることはできませんでした。

  • 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)= などと書いたら出来たのですが、今回は永遠に終わらないので書き方が分かりません。 どの様に返値を指定すればいいのでしょうか?

  • schmeですが違いがわかりません

    (define make-counter1 ((lambda (c) (lambda () (lambda () (set! c (+ c 1)) c))) 0)) (define make-counter2 (lambda () (let ((c 0)) (lambda () (set! c (+ c 1)) c))))    (define c1 (make-counter1)) (define c2 (make-counter1)) (define d1 (make-counter2)) (define d2 (make-counter2)) (c1) (c2) (c1) (d1) (d1) (d2) のプログラムにおいて、c1、c2は呼び出しが異なっても結果は同じものが呼び出されますが、d1、d2はそれぞれ別物が呼び出されています。 どうしてこうなるのかがわかりません。どなたかおしえてくれませんか?それぞれ前者ではletはdefineの実行段階で実行されますが、後者ではletはd1、d2の実行段階で実行されるらしいのですが、どうしてそうなるのかがわかりません。

  • プリンターエラーが発生しました。

    プリンターエラーが発生しました。電源を入れ直してください。詳しくはマニュアルをご覧ください。エラーコード:0x97 ※OKWAVEより補足:「EPSON社製品」についての質問です。

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

  • プリンターエラーが発生しました。

    メッセージに プリンターエラーが発生しました。電源を入れ直してください。詳しくはマニュアルをご覧ください。 エラーコード :0x97  の表示が! ※OKWAVEより補足:「EPSON社製品」についての質問です。

  • 深刻なエラーが発生しました

    深刻なエラーが発生しました 最近「あなたの人生に深刻なエラーが発生しました。サポートセンターに問い合わせ、対処して下さい」 と表示されたのでサポートセンターに問い合わせたところ、 「こちら側でも対処できません」 と言われました どうにかしてエラーから回復したいのですがどうにかなりませんか?

  • WindowsUpdateでエラーが発生

    FMV ESPRIMO FH90D2B Windows10Homeバージョン2009 2019年7月モデル COREi7 64bit WindowsUpdateでエラー(0x8007000d))が発生します。幾度トライしてもエラーが発生しました。パソコンには詳しくありませんが、対処方法を伝授して下さい。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • エラーについて

    Cプログラミングについての質問です.よろしくお願いします. 以下のヘッダファイル(param.h header.h),および,mainファイル(以下はそのファイルの一部)が正しくコンパイルされるということなのですが,linuxでエラーがでます. エラー内容は error:redifinition of typedef 'gtype_t' error:previous declaration of 'gtype_t' was here です. <param.h> #define F_X pow((x),2)-2 /*探索する関数.関数への入力はx,関数からの出力はy*/ #define G_Y 1/(1+fabs(y)) /*関数の出力に対しての適合度.適合値は高いほどよいものと扱われる,f(x)=0が最良*/ #define GRAY 1 /*グレイ表現なら1,バイナリ表現なら1*/ /*GAのパラメータ群*/ #define MAX (0) /*扱う実数の最大値*/ #define MIN (255) /*扱う実数の最小値*/ #define LENGTH (8) /*遺伝子のコード長*/ #define POP (8) /*個体数*/ #define CODE_MAX 1 /*各遺伝子コードの最大値.これが1ならコードは0か1になる.ビット文字列の場合は1*/ #define GAP 0.7 /*一回の生殖で子供と入れ替わる割合*/ #define ELITE_RATE 0.8 /*そのまま残る数のうち,エリートの割合*/ #define P_MUTATE 0.13 /*突然変異率.LENGTHの逆数程度が良い.*/ #define P_CROSS 1.0 /*交叉確率*/ #define GENERATION 5 /*GAを計算する世代数*/ #define SELECTION_METHOD 1 /*1はルーレット,2はトーナメント*/ #define TOURNAMENT_SIZE 5 /*トーナメントサイズ.トーナメントのときだけ意味がある*/ /*出力*/ #define PRINT_GROUP 1 #define PRINT_FITNESS 1 <header.h> typedef int* gtype_t; typedef struct ga_individual* individual_t; struct ga_individual{ gtype_t gtype; /*遺伝子型 int配列の先頭ポインタ*/ double ptype; /*表現型*/ double fitness; /*適合度*/ individual_t next; /*線形リストでの次の個体*/ int rank; /*線形リストの中での順位(ソート後)*/ int parent1; /*交叉での親1のインデックス*/ int parent2; /*交叉での親2のインデックス*/ int cross_point; /*交叉したポイント*/ }; typedef struct ga_population* ga_population_t; struct ga_population{ individual_t genes; /*個体の線形リスト先頭へのポインタ*/ double *pselect; /*適合度の配列*/ int mutate_count; /*突然変異回数の合計*/ double max_fitness; /*適合度の最大値*/ double min_fitness; /*適合度の最小値*/ double avg_fitness; /*適合度の平均値*/ int population_size; /*集団の個体数*/ int code_length; /*遺伝子長*/ int code_max; /*各遺伝子座の最大値,ビットストリングの場合は1*/ }; <main> /*実数とバイナリ・グレイ表現への変換*/ /*与えられた実数に近い,ビットストリング型のgtypeを作る.*/ /*GRAY=1指定される時はグレイ表現に変換*/ /*最後の桁まで計算した後に残る端数切り捨て*/ typedef int* gtype_t; void encode_gtype(double value,gtype_t gtype,int code_length,double min,double max) { double gap = max-min; double remain_value = value-min; /*値のうち,遺伝子によって表現されている部分*/ double value_of_code; /*その桁の遺伝子が表現する値*/ int position = 1; int pre_code = 0; int i = 0; int tmp; /*グレイ表現変換用,一時保管変数*/ while (i<code_length){ value_of_code = gap/pow(2,position); if(remain_value >= value_of_code){ gtype[i] = 1; remain_value -= value_of_code; } else{ gtype[i] = 0; } /*グレイ表現への変換 バイナリ表現と,元のバイナリを右に1シフトしたもののXORをとる*/ if(GRAY == 1){ tmp = gtype[i]; gtype[i] = (pre_code) ^ (gtype[i]); pre_code = tmp; } position++; i++; } return; } 以上です. よろしくお願い致します.