2009-03-11 17 views
11

の再帰ソリューションの良い銀行私はthis questionを見ましたが、その答えはあまり関係ありません。 友人は、再試験の問題の銀行が必要です明日のために勉強するのに役立ちます。C/C++/Java/C#

彼は理論的に問題を学んだが、実際に再帰問題を解決する方法を掌握する上で問題を抱えている。あなたは解決された再帰問題の良い情報源を知っていますか(ネットではC言語でも可能ですがC言語でも可能です)。

注 - 関数型言語の例はあまり役に立ちません。私の友人は明日テストに合格するために勉強していますが、この時点で言語を切り替えるだけで彼は混乱してしまいます。

+0

Dammit、私は再帰的な再帰のジョークを作るつもりだったが、私はそれがリンクされたスレッドへの最初の答えだと思う。 –

+0

古いことわざがあります。「再帰を理解するには、再帰を理解することが役立ちます。」 –

+0

プログラミング言語の構文は、再帰自体を理解することとは独立しています。関数型言語を考慮してください。 –

答えて

5

This articleは、再帰を説明し、リンクリストとバイナリツリー機能を呼び出すことができ、C/C++言語で

9

再帰を学ぶ最も良い方法の1つは、HaskellやLispやSchemeなどの関数型プログラミング言語で経験を積むことです。

再帰的な問題を発見することは、関数型プログラミング言語に関連するいくつかの問題とその答えを見つけることに減らすことができます。例は99 lisp problemsです。

実際にSchemeやLispを学ぶのに5分しかかかりませんので、明日のテストですぐにサンプルを始めることができます。

帰納法を学ぶもう一つの素晴らしい方法は、帰納法を含む数学的証明法を実践することです。再帰に関連する


重要な概念:あなたが問題を解決する方法を知っている必要はありません再帰で

。あなたは2つのことを知る必要があります。 1)問題の最小のインスタンスを解決する方法、2)小さな部分に分割する方法。

同様に、1)基本ケースと2)再帰的ケースが必要であることに留意するだけです。

ベースケースは、最小の入力で何をしたいかという1つのインスタンスを処理します。

再帰的なケースは、問題をサブ問題に分割します。最終的に、このサブ問題は基本ケースに還元されます。

例:

//1+...+n = n*n(+1)/2 = sumAll(n): 

int sumAll(int x) 
{ 
    if(x == 0) //base case 
    return 0; 
    else 
    return sumAll(x-1) + x; //recursive case 
} 

それはベースケースを把握するのは難しいではないことを理解することが重要です。ただ存在しなければなりません。ここでのx> 0のための同等のソリューションは、次のとおりです。

//1+...+n = n*n(+1)/2 = sumAll(n): 
int sumAll(int x) 
{ 
    if(x == 1) //base case 
    return 1; 
    else 
    return sumAll(x-1) + x; //recursive case 
} 
+0

Common Lispのようなものは、過剰なものです。スキームは非常にうまく動作します。 –

2

これは非常にラメの答えのような音に起こっているが、再帰は、初心者のために最初に把握することは、しばしば非常に難しいパラダイムです。あなたの友人がそのコンセプトをしっかり把握するためには、1日以上の瞑想が必要です。

潜在的な学習の方向については、彼にProject Eulerを読ませてもらうことができます。

+1

ウェブサイト全体を注意深く勉強するのに十分な時間は、おそらく1日ではないでしょう。

+0

あの先生に! – Boydski

+2

私はそれが誰の恩恵をもらっているとは思わない、このすべては "あなたの心を吹き飛ばす準備ができている:ここに再帰が来る"ものだ。それはそれほど難しいことではありませんが、怖い人はそれをより困難にします。 – slim

2

ハスケルの構文は、パターンマッチング構造が基本ケースと再帰的ケースを非常に明白にするので、再帰的に考えてみると良いと思います。これを別の言語に翻訳するのはかなり簡単です。

sumAll [] = 0 
sumAll (x:xs) = x + sumAll xs 

はこれを理解するには、あなたが本当に唯一、

  • []は空のリストを表していることを知って
  • 必要があります(X:XS)が頭の中にリストを分割(x)とtail(xs)

ハスケルのすべてを習得する必要はありませんが(難しいことに直面します)、基本のいくつかを実行することは確かに再帰で考えるのに役立ちます。

0

読むSICP(計算機プログラムの構造と解釈)

0
#include<iostream> 
using namesspace std; 
int E(int x); 
int main() 
{ 
    int x; 
    cout << E(x) << endl; 
    return 0; 
} 

int E(int x) 
{ 
    return x ? (x % 10 + E(x/10)) : 0; 
} 
1

を横断するためのいくつかの簡単なCの例がありますこのケースは再帰と呼ばれます。主に再帰は2つの場合があります。

  1. ベースケース。再帰的ケース。

と我々として...

  1. ライナー再帰
  2. バイナリ再帰のようないくつかの再帰的なカテゴリがあります
  3. 入れ子の再帰
  4. 相互再帰
  5. 末尾再帰

ここでは再帰を議論する例を取る...

// a recursive program to calculate NcR // 
#include <stdio.h> 
int ncr(int x,int y) 
{ 
    if(y>x) 
    { 
     printf("!sorry,the operation can't processed."); 
     getch(); 
     exit(1); 
    } 
    else if(y==0 ||y==x) //base case 
    { 
     return(1); 
    } 
    else 
    { 
     return(ncr(x-1,y-1)+ncr(x-1,y)); //recursive case 
    } 
}