• ベストアンサー

StandardMLで整数リストの奇数・偶数番目の要素の和を組として返したい

aid-uの回答

  • ベストアンサー
  • aid-u
  • ベストアンサー率75% (22/29)
回答No.4

>fun sum(nil)=(0,0) > | sum(x::y::z)= 現在の関数は、リストの長さが偶数の場合しかマッチしないものとなっています。 『sum (x::nil)』のパターンを追加すれば良いと思います。

yu-ki8877
質問者

お礼

いろいろと教えて頂きありがとうございました。 なんとか自分でプログラムを完成させることができました。

yu-ki8877
質問者

補足

度々すいません。パターンの追加は分かりましたが、このパターンの時にどういった処理をさせればいいでしょうか。下記のプログラムでコンパイルするとエラーメッセージが出ました。 - fun sum(nil)=(0,0) = | sum(x::nil)=(x+L,M) = |sum(x::y::z)= = let = val(L,M)=sum(z) = in = (x+L,y+M) = end; stdIn:63.20 Error: unbound variable or constructor: M stdIn:63.18 Error: unbound variable or constructor: L

関連するQ&A

  • Standerd MLでリストの先頭から2つずつ要素を組にしたリストを作りたい

    Standerd MLの問題で整数のリストの先頭から2つずつ要素を組にしたリストを求める関数でcomを作りたい。 'a list->('a*'a)listでcom([1,2,3,4])の場合は([1,2],[3,4]),元の要素数が奇数の場合は0を入れる。 自分で途中までは考えれました。 fun com(nil)=nil | com(x::xs)= if xs=nil then x::0 else x::sx | com(x::xs::xxs)= if xxs=nil then x::xs else com(xxs); これで実際に正常に動作するかどうかわかりません。 ご指導よろしくお願いします。

  • Haskell 整数の各桁を要素とするリストを返す

    Haskell を試してみたいと思い、ちょうど計算したいこともあったのでWebを見ながらプログラミングをはじめました。 とりあえず、正の整数を引数として、その整数の各桁を要素とするリストを返すような関数が必要だったので、見よう見まねで下のプログラムを書きました。 しかし、エラーが解消されずとん挫してしまいました。整数の割り算が良くなかったようですが、どのように直せばよいでしょうか。 どうぞよろしくお願いします。 main=((putStrLn . show) . a) 123 a :: Int -> [Int] a n = f n [] where f :: Int -> [Int] -> [Int] f n b | n == 0 = b | n /= 0 = mod n 10 : f ((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10) ) b エラーメッセージは次のようでした。 paiza.io というホームページで提供されている環境を使いました。 [1 of 1] Compiling Main ( Main.hs, Main.o ) Main.hs:9:31: error: ? No instance for (Fractional Int) arising from a use of ‘/’ ? In the first argument of ‘f’, namely ‘((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10))’ In the second argument of ‘(:)’, namely ‘f ((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10)) b’ In the expression: mod n 10 : f ((/) (fromIntegral ((-) n (mod n 10))) (fromIntegral 10)) b

  • 各桁の和を返す関数

    一つの正整数を引数として受け取り、 その整数の各桁の和を返す関数を作成する。 この関数を用い、いくつかの正整数を入力して その整数の各桁の和を表示する。 入力の終わりは、0または負のデータが現れたことで 判定する。 というC言語の問題なんですが、 整数の各桁の和を返す関数がうまくできません・・。 123が15となってしまいます・・。 とりあえず最初の部分を作ってみました。 初心者なのでミス多いかもしれませんが どなたか教えていただけませんか? #include<stdio.h> #include<conio.h> int sum(int n) n=(n/10)+(n%10); return n; } main() { int n,sum2; scanf("%d",&n); sum2=sum(n); printf("%d",sum2); }

  • MATLABでの行列の全要素の和

    MATLABでの行列の全要素の和を計算するのに下の例のようにfor文を使うのとsum関数を使うのとで結果が違います。何故ですか? 計算結果の差をとってみると極々微小な差が生じてしまいます(e-10位)。 シミュレーションの中でこのような処理を行っているのでより正確な方が知りたいです。 例 A=rand(10); plus=0; sum=0; for i=1:10  for j=1:10   plus=plus+A(i,j);  end end sum=sum(A(:));

  • C++ 連結リストの要素の削除について

    リストで任意の場所の要素を削除するプログラムを考えているのですが、どうしてもその部分のプログラムにmain関数通りの動きをさせる方法が分かりませんでした。いろいろ試してみたのですが、どこかしらでおかしくなってしまうのです。 以下に私がつくった途中までのプログラムを示すので、removeAt(int index)の中身の例を教えて頂きたいのです。よろしくお願い致します。 #include <iostream> using namespace std; // クラスの宣言 class Cell { friend class List; // Listクラスから,このクラスに自由にアクセスできるようにする private: int data; // データ Cell *next; // 次のセルのアドレスを指すポインタ public: Cell(int _data, Cell *n = NULL){ data = _data; next = n; } }; class List { private: Cell *head; // 連結リストの先頭要素のアドレスを指すポインタ public: List(){ head = NULL; }; ~List(){ while (head != NULL)removeFirst(); } void addFirst(int data){ head = new Cell(data, head); } void removeFirst(){ if (head == NULL)return; Cell *removed = head; head = head->next; delete removed; } void removeAt(int index); void print(){ for (Cell *p = head; p != NULL; p = p->next){ cout << p->data << ' '; } cout << endl; } }; // 連結リストの index 番目の要素を削除する関数 void List::removeAt(int index) { //この部分です } int main() { List l1; for (int i = 0; i < 10; i++) { l1.addFirst(i); } l1.print(); l1.removeAt(0); // リストの先頭要素で動作確認 l1.print(); l1.removeAt(2); l1.print(); l1.removeAt(4); l1.print(); l1.removeAt(17); // リストの要素数より大きな引数で動作確認 l1.print(); l1.removeAt(0); // リストの先頭要素で動作確認 l1.print(); l1.removeAt(6); // リストの要素数より大きな引数で動作確認 l1.print(); l1.removeAt(5); l1.print(); return 0; } 要求される実行結果は以下の通りです リストの内容: 9 8 7 6 5 4 3 2 1 0 リストの内容: 8 7 6 5 4 3 2 1 0 リストの内容: 8 7 5 4 3 2 1 0 リストの内容: 8 7 5 4 2 1 0 リストの内容: 8 7 5 4 2 1 0 リストの内容: 7 5 4 2 1 0 リストの内容: 7 5 4 2 1 0 リストの内容: 7 5 4 2 1

  • コンパイルエラー

    コンパイルしても、12行目(printf("%d番目の整数を入力してください。"i+1);が、関数呼び出しに)がないとでます。でもどこが間違っているか分かりません。 教えてください。お願いします。 #include <stdio.h> int main(void) { int num; int sum=0; int i; for(i=0; i<10; i++){ printf("%d番目の整数を入力してください。"i+1); scanf("%d", &num); sum+=num; } printf("合計は、%dです。\n", sum); return(0); }

  • リストを操作する関数ref,add,delについて

    リストを、長さが動的に変化する配列のデータ型とみなし以下の関数を作成せよ。 1、リスト中の要素を参照する関数refは(ref l n)の形式である。ここに、lは参照するリストである。nは整数値であり、l中の参照する要素の位置を示す。 2、リストに要素を追加する関数addは(add e l n)の形式である。ここに、eは追加する要素、lはeを追加するリスト、nは整数値であり、lのn番目の要素の直前にeを追加することを意味する。 3、リストから要素を削除する関数delは(del l n)の形式である。ここに、lはリストである。nは整数値であり、lのn番目の要素を削除することを意味する。 Lispで作成しなければなりません。 どのようにプログラム組めばよいのかわかりません。教えてください。

  • このプログラムにアドバイスをください

    問題が  ・100個の要素を持った一次元配列をmain()関数内で宣言 ・一次元配列と要素数を引数として持つ関数seisei() ・関数seisei()は乱数を使い渡された配列を0~99の整数で初期化する。 ・一次元配列、要素数そして変数のポインタを引数としてもつ関数goukei() ・関数goukei()は渡された配列に格納された数値の合計を計算し、渡された変数のポインタにその合計値を代入する。 と問題があり、下記のようにプログラムを作ったんですが、どうしてもコンパイルできません。どなたかご指摘よろしくお願いします。 #include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",&sum); return 0; } void seisei(int *a[i], int n) { srand(time(NULL)); for(i = 0; i <= n; i++){ *a[i] = rand() % 100; } } void goukei(int *a[i],int n,int *sum) { *sum = 0; for(i = 0; i <= n; i++){ *sum += *a[i]; } }

  • リスト構造

    リスト構造を用いてheadと整数x(int型)を引数にとって、 リスト中のn番目にxが存在していればnを返して、そうでなければ -1を返すような関数を作りたいんですけど教えてください。

  • mathmaticaについて詳しい方に助けを借りたいです。

    以下の問題の精密解答が欲しいです…。 自分でやっても、エラーばかりで、どこが間違っているのかがよくわからないので、誰か助けてください! 1問だけでも解答が頂けると助かります。 1.0≦x≦n,0≦y≦nの範囲の格子点(x,y)でxが奇数でy<x^2をみたすもの全体のリストg(n)を求める関数gをMathmaticaによって定義せよ。 2.x[0]=0.1,x[n+1]=2.5(1-x[n])x[n]によって数列x[n]を定義する。初期値a(=x[k])からはじめて、|x[n+1]-x[n]|が許容誤差eps未満になるまで繰り返しx[k],x[k+1],...を求め、|x[n+1]-x[n]|<epsを満たす最初のx[n]を求める関数ff(関数適用はff(a,eps))をMathmaticaによって定義せよ。 3.与えられた整数のリストxsに対して、はじめに、負の要素が並び、つぎに3で割った余りが1のxsの要素が並び、最後にそれ以外のxsの要素が並んだリストを返す関数hをMathmaticaによって定義せよ。