• ベストアンサー

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

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

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

;;; doを使ってこう言う手もあります。 (define (foo n x)  (do ((m n (- m 1))     (y x (cdr y))     (z '() (cons (car y) z)))    ((zero? m) (cons (reverse z) y)))) ;;; 実行例 > (foo 3 '(1 2 3 4 5 6 7 8 9 10)) ((1 2 3) 4 5 6 7 8 9 10) ;;; 結果は同じですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

;;; コード例: (define (foo n x)  (let loop ((m n) (y x) (z '()))   (if (zero? m)     (cons (reverse z) y)     (loop (- m 1) (cdr y) (cons (car y) z))))) ;;; 実行例 > (foo 3 '(1 2 3 4 5 6 7 8 9 10)) ((1 2 3) 4 5 6 7 8 9 10)

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

Schemeには慣れていないのでどんくさいコードになっているかもしれないけど,手元のGauche v0.8.14では (define (hoge args n) (define (fuga arg1 arg2 x) (if (> x 0) (fuga (cdr arg1) (cons (car arg1) arg2) (- x 1) ) (cons (reverse arg2) arg1 ) ) ) (fuga args '() n ) ) (hoge '(1 2 3 4 5 6) 3) ==================== で ((1 2 3) 4 5 6) となった。 arg1 を (cons arg1 '()) としたら ((1 2 3) (4 5 6)) が得られた。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リスト構造

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

  • 気体分子の確率分布

    分子の分布確率の問題で、 2つの領域の容積が等しい箱の中に、N個の分子があるとする。 N個の分子のうち、右側の領域に来る分子n個を選び出す組み合わせは N!/{n!(N-n)!} n個が右側、残りのN-n個が左側の領域にある確率は P(n)=(1/2)^N・N!/{n!(N-n)!} N>>1のとき スターリングの公式より logP(n) = log(N!)-log(n!)-log(N-n)!-Nlog2 ≒ -N(log2+(n/N)log(n/N)+((N-n)/N)log((N-n)/N))・・・(1) P(n)が (n/N)=(1/2)になることを予想して x=(n/N)-(1/2) とする。 ここまでは理解できたのですが 対数関数の展開式 log(1+x)=x-(1/2)x^2+(1/3)x^3-… を利用して(1)を展開し、xを連続関数と見なして、 xがxとx+dxの間にある確率をP(x)dxとすると、 P(x)=(√2N/π)exp(-2Nx^2) になる。 この展開式からからP(x)までの変形が分かりません。 規格化条件からexpの係数が√2N/πになるのは分かったんですが。。。 ご教授よろしくお願いします。 また何か参考にできるサイト等ありましたら教えていただけるとありがたいです。

  • scheme

    リストに含まれる記号の数を求める手続きを作りたいのですが。 (0 -1 -2 -3) この場合は0を返す (pooh piglet 2001)  この場合は2を返す (1192 538 (owl rabbit))  この場合は2を返す 再帰を使うのですがうまくいきません。 1つめと2つめの例はできるのですが、3つめは中にリストがあって そのリストの中も数えるところがよくわかりません。 (define (count x) (if (null? x) 0 (if (number? (car x)) (count (cdr x)) (+ (count (cdr x) 1))))) これだとうまくいきませんでした。 おねがいします。

  • バブルソートの交換回数、連結(リンク)リストの短所

    バブルソートの交換回数を表す一般的な式(nを用いた式)が分かりません。 具体的には n個のメンバーの場合1ラウンドあたりn/2回の交換なので 全ラウンドでの交換は[(n/2)*{(n-1)/2}]/2=n*(n-1)/8回となるらしいのです。 でも例えば例題で「96 23 87 8 76」というn=5の数字群をバブルソートで並び替えるには、上の式だと並び替える回数は2.5回になってしまいます。小数が出るのはおかしいと思うのですが・・・ この場合交換回数は地道に数えるしかないのでしょうか。 ちなみに比較回数はn(n-1)/2なので10と出せました。 あと連結(リンク)リストの長所は検索できたのですが短所についての記述が見つかりません。 短所はあるのでしょうか、あるならどのような内容なのでしょうか。 一方でもいいので宜しくお願いします。

  • 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によって定義せよ。

  • x.>0ときγ(x)が最小値となるxの値は何か?

     xは実数でx.>0とすると、ガンマ関数Γ(x)はx=1.461633近辺で最小値をとるようですが、その具体的な値と算出方法がわかりません。  最初は単純にΓ'(x)=0を考え、Γ(x) = ∫t^(x-1) e^(-t) dt (∫は t = 0 から ∞)を微分すると ∫t^(x-1) e^(-t) (log t) dt となりましたが、ここから先に進めませんでした。  次にディガンマ関数ψ(x)=Γ'(x)/Γ(x)、Γ'(x)=Γ(x)*ψ(x)であり、x>0の場合Γ(x)>0なので、Γ'(x)=0の場合はψ(x)=0になるだろうと思い、ψ(x)=-γ-1/x+Σ[n=1,∞](1/n-1/(n+x))=0を考えてみようとしましたが、これもここから先がよくわかりません。  ひょっとしてこれは複素解析の知識が必要なのでしょうか?。どなたか具体的な値と算出方法をご教示願います。

  • シグマの収束値計算です

    Γ(z)をガンマ関数とします。 シグマのnが1~∞とした時の Σ[{2π^(n/2)/Γ(n/2)}*x^n] の収束値を求める問題です。(n/2)が入っているのでnが偶数の場合と奇数の場合に分けて、それぞれがある値に収束している、という方向性で計算すればよいと思うのですが、実際どのように計算式を始めて行けばよいのか分かりません。 ご回答よろしくお願いします。

  • リストを操作する関数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で作成しなければなりません。 どのようにプログラム組めばよいのかわかりません。教えてください。

  • 超高次の多項式の原始関数を求めたいのですが

    f(x) = (n-x)(n-1-x)(n-2-x).....(n-m-x) n: 大きな自然数(例えば1000000など) m: n>mの大きな自然数(例えば100000など) という多項式 f(x)の原始関数を高速に求めるアルゴリズムを考えて います. f(x)を具体的に展開してから原始関数を求めれば簡単だと思い,上記 の式を展開するプログラムを書いたのですが,組み合わせの計算を する必要が生じて,mの値が大きな時に高速に計算できませんでした. 原始関数を直接導出しようと,いろいろ場合分けして考えてみたので すが挫折しました. アドバイス頂けませんでしょうか? よろしくお願いします.

  • すみません、数式の意味を教えてください。

    Φ(X^n)とΦ(X^n;X^n)の違いが理解できません。 左は単純に関数Φ(X^n)の値だとわかるんですが、右は何が違うのかわかりません、どなとか教えてください。