問題解決スキルを身につけることは、問題を解決することと同じか、それ以上に難しい。
     

     大抵の問題は、既存の知識だけでは解けない。解けるとしたら、そもそも問題に値しない。
     問題解決においては、「答え」はこれから見つけるもの、いや創り上げるものであって、あらかじめ誰かの頭やポケットの中にあるのではない。
     問題解決のプロセスを説明したものはいくつもあるが、指針のようなものにはなっても、決まった手順やアプローチとして受け取るとあまり良いようにならない。
     予定通りに事が進むなら、すでに問題は解決しているのだ。
     実際は、問題解決は発見や新しい知識の創造を含んでいる。そのため決まった手順を適用するだけでは不可能であり、ほとんど必然的に飛躍や逸脱、もちろん試行錯誤、それに僥倖すらも不可欠の構成要素となる。
     

     問題解決が真っ直ぐ進むものでないのなら、何を導きとすれば良いのだろうか?

     自分がやった問題解決自体が、あなたのメンターになるのである。

     1978年に「効率的で信頼できるソフトウェアの作成手法への明確な寄与に対して。および構文解析理論、プログラミング言語の形式意味論、自動プログラム検証、自動プログラム合成、アルゴリズム解析といった情報工学の下位分野の開拓への重要な寄与に対して」チューリング賞を授与された情報工学者ロバート・W・フロイドは、チューリング賞受賞講演の中でこう言っている。

    In my own experience of designing difficult algorithms, I find a certain technique most helpful in expanding my own capabilities. After solving a challenging problem, I solve it again from scratch, retracing only the insight of the earlier solution. I repeat this until the solution is as clear and direct as I can hope for. Then I look for a general rule for attacking similar problems, that would have led me to approach the given problem in the most efficient way the first time. Often, such a rule is of permanent value.  

    「私は、複雑なアルゴリズムをデザインしてきた経験から、自分の能力を高めることに役立つひとつのテクニックを発見した。難しい問題を解決したら、同じ問題をもう一度はじめから解いてみるのだ。前回、問題を解決するに至った道筋をできるだけ忠実に再現してみる。そうすることで、同様の問題に取り組む際に共通するルールのようなものを探す。どうすればもっと早く解決ができたのかも、それでわかる。そうして見つけたルールは、時に永遠の価値を持つ」
    (Robert W Floyd(1978). “Turing Award Lecture, : The Paradigms of Programming,” Communications of the ACM, Vol.22:8, August 1979, pp.455-460.  http://www.jdl.ac.cn/turing/pdf/p455-floyd.pdf

     
     何故(わざわざ)、解き終えた問題にもう一度取り組むのか?
     
     人は自分がやった問題解決であっても、そのすべてを理解してはいない。
     問題解決に何が有効であり何がそうでなかったかを見極めるのには距離をとる必要がある。
     投じた努力の意義と意味、自分自身の内に生まれたインスピレーションの含意を理解するには時間がかかる。
     それらの本当の果実は、まだ収穫されていないのである。
     
     また二度目の問題解決は、たいていは一度目の時よりずっと速やかに進み、労は少なく益が多い。
     二度目であればこそ、一度目では気付かなかったアイデアやアプローチを思いつける。
     事によると、一度目では到達し得なかった解決を発見できる可能性すらある。
     なんとなれば、我々はすでに問題について熟知しており、加えて解決がどんなものか、そもそも解決があるのかについても今や多くを知っている。
     試行錯誤の多くの枝ははらわれ、一度目には選択肢(オプション)とならなかった域へのチャレンジも可能になる。

     そして、立ちふさがっていた問題は、解決にたどり着いた今、長く厳しい問題解決を共に戦った戦友となっている。
     
     
     
    繰り返しはあまり役に立たない

     ものを覚えるのに、今でも頻繁に使われる方法に《繰り返す》というのがある。
     これは思ったほど(一般に思われているほど)効果がない。
     
     記憶システムを短期記憶と長期記憶から構成されるものとするレトロな二重貯蔵モデルにおいては,繰り返し唱えたり書きなぐったりして、記憶したい情報を反復することで,短期記憶から情報が失われないようにすると同時にその情報を長期記憶へと転送させるのだと考えられていた。
     ところが,情報を単に反復することに時間を費やしても,必ずしもそれが記憶として定着するわけではないことがその後分かってきた。
     現在では,こうした《繰り返し》は維持リハーサル maintenance rehearsal(または1次リハーサル primary rehearsal)と呼ばれ,情報を短期記憶に一時的に保持させるに過ぎないと考えられている。


    記憶技法はめんどい

     情報を長期記憶に送り込むには、同一の符号系列の単純な反復である維持リハーサルではなく、情報に対するイメージの構成や意味的処理によって既有知識と関連づける精緻化リハーサルが有効である。
     記憶したい情報を相互に関連づけたり情報の意味づけを行う、いわゆる《深い処理》にあたるものだ。
     単語のスペルや音韻に注意したり,繰り返し読み上げたり書き写したりするような「浅い」処理を行うよりも,意味を考えたり,イメージしたり、自分の経験と関連づけるような「深い」処理を行う方が,その単語の保持成績は優れたものになる。
     記憶したいものをカテゴリーに分類したり,記憶すべき項目をあらかじめ決めた場所に置いたり,各単語や単語リストのイメージを作るというイメージ化することも、これにあたる。
     いわゆる記憶技法や記憶方略として知られているものは、この《深い処理》をプロセスに含んでいる。
     
     しかし問題は残る。
     
     記憶技法は、それなりの準備や訓練を必要とするものが多い。
     《深い処理》自体が難易度が高い方法だったり、そうでなくても手間暇がかかることが多い(手間暇をかけ、簡単にすまさないから「深い」処理になるのだとすら言える)。
     記憶技法や記憶方略は、それぞれに効果のあるものなのだが、思ったほど普及しないのは、ぶっちゃけ「面倒くさい」からである。
     
     では、とりあえず《繰り返す》よりはましで、《深い処理》ほど面倒くさくない方法はないのだろうか?
     
     もっとずっとシンプルで、特別な訓練も、特殊な準備も必要のないものは?
     
     
    ただ《持っておく》こと

     紹介するのは、あまりに地味なので、意外に知られていない方法である。
     

     A.誰かに読み上げてもらった単語を、すぐに復唱する
     
     B.誰かに読み上げてもらった単語を、15秒間待ってから、復唱する
     

     これはすぐに実験できるから、AとBをどちらも試してみよう。
     
     Bのやり方の方が、圧倒的に記憶に残る。
     違いは「15秒間待つ」ことだけである。
     
     
     短期記憶に情報が保持される時間はかなり短く、通常15秒(長くても30秒)程度と考えられている。
     それを超えて記憶を保持しようとすれば、情報を処理せざるを得ない。
     記憶したい情報をただ流すのでなく、少しの間「持っておく」ことで、情報処理プロセスを作動させる訳である。
     

    4つの基本技

     では「15秒待つ」ことを組み込んだ記憶法の4つあげよう。
     4つというのは2種類のインプット(聞く/読む)と2種類のアウトプット(言う/書く)を掛け合わせた数である。
     どれもシンプルな方法なので、いろんな記憶技法や記憶方略と組み合わせることも簡単である。


    (1)delayed repetition 聞く→言う

     時間差復唱。
     耳で聞いた情報(たとえば単語や文)を、15秒待ってから、復唱する。
     
     
    (2)delayed dictation 聞く→書く

     時間差ディクテーション。
     耳で聞いた情報(たとえば単語や文)を、すぐに書き留めるのでなく、15秒待ってから、書き出す。
     

    (3)delayed copying 読む→書く

     遅延写経。
     読んだ情報(たとえば文字や単語や文や数式など)を、すぐに書き写すのでなく、15秒間待ってから、何も見ずに書き出す。


    (4)Read & look-up 読む→言う

     時間差音読。
     読んだ情報(たとえば文字や単語や文や数式など)を、すぐに発音/発声するのでなく、15秒間待ってから、何も見ずに唱える。




    (関連記事)

    (保存版)覚え方大全/自分で選ぶための53種の記憶法カタログ (保存版)覚え方大全/自分で選ぶための53種の記憶法カタログ このエントリーをはてなブックマークに追加

    復習のタイミングを変えるだけで記憶の定着度は4倍になる 復習のタイミングを変えるだけで記憶の定着度は4倍になる このエントリーをはてなブックマークに追加

    古今東西の記憶術をざっくり7つにまとめてみた 古今東西の記憶術をざっくり7つにまとめてみた このエントリーをはてなブックマークに追加







    Learning Vocabulary in Another Language (Cambridge Applied Linguistics)Learning Vocabulary in Another Language (Cambridge Applied Linguistics)
    (2001/03/15)
    I. S. P. Nation

    商品詳細を見る



    Teaching ESL/EFL Listening and Speaking (ESL & Applied Linguistics Professional Series)Teaching ESL/EFL Listening and Speaking (ESL & Applied Linguistics Professional Series)
    (2008/10/15)
    I.S.P. Nation、Jonathan Newton 他

    商品詳細を見る



    少しの工夫で効果4倍!魔法の英語語彙指導アイデア (授業をグーンと楽しくする英語教材シリーズ12)少しの工夫で効果4倍!魔法の英語語彙指導アイデア (授業をグーンと楽しくする英語教材シリーズ12)
    (2010/01)
    岡田 順子

    商品詳細を見る




    FC2ノウハウ

    ・数式処理システムの中で多分一番有名なMathematica
    ・無料で利用できる数式処理システムでは一番知られたMaxima
    ・iPhone/iPod touchで使える数式処理システムMathStuio(元Spacetime)
    の3つについて、同機能の関数等を対照表にまとめてみた。


    MathematicaとMaximaについては、オンライン上のリソースや出版物がいろいろ出ているので、 それらを参考にMathStuio(元Spacetime)を活用するのに役立つかもしれない。


    MathStudio App
    カテゴリ: 教育
    価格: ¥1,700




    A.1 演算と数値
    Mathematica
    Maxima
    MathStuio(元Spacetime)
    a+ba+b;a+b
    a-ba-b;a-b
    a*ba*b;a*b
    a/ba/b;a/b
    a^ba^b;a^b
    Sqrt[a]sqrt(a);sqrt(a)
    N[a]float(a);なし
    N[a,b]fpprec:n; または bfloat(a);なし

    A.2 代数
    A.2.1 方程式を解く

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Solve[f[x]==g[x],x]solve(f(x)=g(x),x);Solve(f(x))
    Solve[{f==g,h==k},{x,y}]solve([f=g,h=k],[x,y]);Solve(f(x),g(y))または
    SolveSystem(f(x),g(y))
    NSolve[f==g,x]expand(float(solve(f=g,x)));Solve(f(x),g(y))
    FindRoot[f(x)==g(x),{x,a}]load(newton);
    newton(f(x)-g(x),x,a);
    nSolve(f(x), x, guess)
    またはSolve(f(x), x, guess)

    A.2.2 多項式の操作

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Expand[f[x]]expand(f(x));Expand(f(x))
    Factor[f[x]]factor(f(x));Factor(f(x))
    Together[f[x]]ratsimp(f(x));Together(f(x))
    Apart[f[x]]partfrac(f(x));Apart(f(x))
    Cancel[f[x]]ratsimp(f(x));SimplifyPoly(f(x))

    A.2.3 式の簡約化

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Simplify[f[x]]ratsimp(f(x));SimplifyFunction(f(x),x)
    FullSimplify[f[x]]fullratsimp(f(x));なし

    A.2.4 複素数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    a+b*Ia+b*%i;a+bi
    Re[z]realpart(z);Re(z)
    Im[z]imagpart(z);Im(z)
    Abs[z]cabs(z);Abs(z)
    Arg[z]carg(z);Arg(z)
    Conjugate[z]realpart(z)-imagpart(z)*%i;Conj(z)

    A.3 リストと行列

    A.3.1 リストや行列の作成

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    {a,b,c}[a,b,c];[a,b,c]
    {{a,b},{c,d}}リスト:[[a,b],[c,d]];
    行列:matrix([a,b],[c,d]);
    [[a,b],[c,d]]
    リストモードに
    Command(MatrixDetection=0)
    行列モードに
    Command(MatrixDetection=1)
    Table[a[i],{i,p,q}]makelist(a(i),i,p,q);Sequence(f(x), x, start, end, step,)
    Table[a[i],{i,p,q,r}]makelist(a(p+(q-p)*r),i,1,(q-p)/r);なし

    A.3.2 行列の演算

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    a.ba.b;Dot(a,b)
    Cross[a,b]transpose(adjoint(matrix(a,b,[1,1,1])))[3];Cross(a,b)
    Outer[f,a,b]outermap(f,a,b);
    Tr[a]load(nchrpl);
    mattrace(a);
    Det[a]determinant(a);Det(a)
    CoFactor[a]adjoint(a);coFactor(a)
    Inverse[a]invert(a);Inverse(a)
    Transpose[a]transpose(a);Transpose(a)
    Eigenvalues[a]load(eigen);
    eigenvalues(a);
    Eigenvalues(a)
    Eigenvectors[a]load(eigen);
    eigenvectors(a);
    Eigenvectors(a)

    A.4 三角関数と指数関数

    A.4.1 三角関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Sin[x]sin(x);Sin(x)
    Cos[x]cos(x);Cos(x)
    Tan[x]tan(x);Tan(x)
    ArcSin[x]asin(x);Asin(x)
    ArcCos[x]acos(x);Acos(x)
    ArcTan[x]atan(x);Atan(x)
    TrigExpand[f[x]]trigexpand(f(x));TrigExpand(f(x))
    TrigReduce[f[x]]trigreduce(f(x));TrigReduce(f(x))

    A.4.2 指数と対数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Log[x]log(x);Ln(x)
    Log[10,x]log(x)/log(10);Log(x)
    Exp[x]exp(x);Exp(x)

    A.4.3 双曲線関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Sinh[x]sinh(x);Sinh(x)
    Cosh[x]cosh(x);Cosh(x)
    Tanh[x]tanh(x);Tanh(x)
    ArcSinh[x]asinh(x);Asinh(x)
    ArcCosh[x]acosh(x);Acosh(x)
    ArcTanh[x]atanh(x);Atanh(x)

    A.5 微分積分 A.5.1 通常の演算

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    D[f[x],x]diff(f(x),x);D(f(x),x)
    Integrate[f[x],x]integrate(f(x),x);Integrate(f(x),x)
    Integrate[f[x],{x,a,b}]integrate(f(x),x,a,b);Integrate(f(x),x,a,b)
    Sum[x[k],{k,a,b}]sum(x(k),k,a,b);Sum(x(k),k,a,b)
    Product[x[k],{k,a,b}]product(x(k),k,a,b);Product(x(k),k,a,b)
    Limit[f[x],x->a]limit(f(x),x,a);Limit(f(x),x,a)
    Series[f[x],{x,a,n}]taylor(f(x),x,a,n);Taylor(f(x),x,n,a)または
    Series(f(x),x,n,a);

    A.5.2 微分方程式

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    DSolve[f[y[x]]==0,y[x],x]desolve(f(y(x))=0,y(x)); または
    ode2(f(y(x))=0,y(x),x);
    DSolve(y'(x)=f(x),y(x),no)
    DSolve[{f==0,g==0},y[x],x]desolve([f=0,g=0],y(x));
    DSolve[{f==0,y[0]==a},y[x],x]atvalue(y(x),x=0,a);
    desolve(f=0,y(x));
    DSolve(y'(x)=f(x),y(x),a)

    A.5.3 変換

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    LaplaceTransform[f[t],t,s]laplace(f(t),t,s);Laplace(f(t),t,s)
    InverseLaplaceTransform[g[s],s,t]ilt(g(s),s,t);iLaplace(g(s),s,t)
    FourierTransform[f[t],t,w]load(fft);
    fft(f(t),t,w);
    なし
    InverseFourierTransform[g[w],w,t]load(fft);
    ift(f(t),t,w);
    なし

    A.5.4 ベクトル解析

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Needs["VectorAnalysis`"]
    Curl[vector]
    load(vect);
    curl(vector);
    Curl(vector, [varlist], [mode])
    Needs["VectorAnalysis`"]
    Div[vector]
    load(vect);
    div(vector);
    Divergence(vector, [varlist], [mode])
    Needs["VectorAnalysis`"]
    Grad[vector]
    load(vect);
    grad(function);
    Gradient(function, [varlist], [mode])
    Needs["VectorAnalysis`"]
    HessianH[f_, x_List?VectorQ]
    load(linearalgebra);
    hessian(function, [varlist]);
    Hessian(function, [varlist], [mode])
    Needs["VectorAnalysis`"]
    JacobianMatrix[f_List?VectorQ, x_List]
    load(linearalgebra);
    jacobian(function, [varlist]);
    Jacobian(function, [varlist], [point])
    Needs["VectorAnalysis`"]
    Laplacian[vector]
    load(vect);
    laplacian_matrix(a);
    Laplacian(function, [varlist], [mode])

    A.6 その他の関数

    A.6.1 整数関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Round[x]?round(x);Round(x)
    Mod[n,p]mod(n,p);Mod(n,p)
    GCD[a,b]gcd(a,b);GCD(a,b)
    LCM[a,b]lcm(a,b);LCM(a,b)
    FactorInteger[n]factor(n);nPrimes(n)
    Rationalize[x]ratsimp(x);(ToFractions(x))

    A.6.2 特殊関数

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    n!n!;n!
    BesselI[v,z]bessel i(v,z);BesselI(v,z)
    BesselJ[v,z]bessel j(v,z);BesselJ(v,z)
    BesselK[v,z]bessel k(v,z);BesselK(v,z)
    BesselY[v,z]bessel y(v,z);BesselY(v,z)
    Erf[x]erf(x);Erf(x)
    Gamma[x]gamma(x);Gamma(x)
    Zeta[x]zeta(x);Zeta(x)

    A.7 グラフ

    Mathematica
    Maxima
    MathStuio(元Spacetime)
    Plot[y,{x,a,b}]plot2d(y,[x,a,b]);Plot(y,[x,a,b])
    Plot[{y1,y2},{x,a,b}]plot2d([y1,y2],[x,a,b]);Plot(y1,y2,[x,a,b])
    ParametricPlot[{x,y},{t,a,b}]plot2d([parametric,x,y],[t,a,b]);ParametricPlot([x,y],[t,a,b])
    Plot3D[z,{x,a,b},{y,p,q}]plot3d(z,[x,a,b],[y,p,q]);Plot3D(z,[x,a,b],[y,p,q])
    ParametricPlot3D[{x,y,z},{s,a,b},{t,p,q}]plot3d([x,y,z],[s,a,b],[t,p,q]);ParametricPlot3D([x,y,z],[s,a,b],[t,p,q])
    ListPlot[x]openplot curves(x);ListPlot(x)