1

Coding Bat に関する現在の問題を調べています。

「ブロックでできた三角形があります。一番上の行には 1 つのブロックがあり、次の行には 2 つのブロックがあり、次の行には 3 つのブロックがあり、以下同様です。このような三角形のブロックの総数を (ループや乗算なしで) 再帰的に計算します。指定された行数の三角形。」

問題が何を求めているかを理解し、再帰がどのように機能するかを理解しています。たとえば、再帰関数が与えられた場合、それを手作業で計算し、出力がどうなるかを示すことができます。

問題は、実際には、このような特定の問題から再帰関数を作成することです。これを実際に設定して再帰的に行う方法がわかりません。実際に再帰問題を設定する際に従うべきルールはありますか? 再帰の問題を実際に解決する方法を示すのではなく、再帰がどのように機能するかを示す例しか見つけることができません。実際の再帰アルゴリズムを書く準備をする方法を理解する助けがあれば幸いです。

4

4 に答える 4

4

だいたい:

  1. 常に問題を見て、同じタイプのサブ問題に分割できるかどうかを調べてください。これは、再帰を使用できる可能性があるという最初のヒントです。基本的に、実際の問題のより小さなインスタンス/バージョンを探しています。

    したがって、再帰はトップダウンのアプローチを取ります (より複雑な問題からより単純な問題へ)。

  2. そのようなケースを見つけることができたら、「大きい」ケースと「小さい」ケースの関係を見つけて、再帰ステップを取得する必要があります。

  3. 最後に、終了条件、または停止したい最小または最後のケースを見つけます。

おそらくこれについて知っているでしょうが、そうでない場合は役立つかもしれません。

于 2013-01-23T19:16:11.950 に答える
2

if(rows == 1) return 1;ここでは役に立たない。

再帰的なグローバル問題については、問題を分解して以下を見つける必要があります。

  1. 終了ルール(例のような初期値、または入力の1つの終了条件にすることができます)
  2. ステッピング プロセス (次の入力を取得するために前の入力をどうする必要があるか)

そして、それ自体を呼び出す関数でそれらを組み立てます。

于 2013-01-23T19:00:32.080 に答える
2

recursionアルゴリズムの場合、

最初に、関数がスタックの巻き戻しを開始するか、ベース値を返すbaseケースを設計します。

non-base次に、ケースごとに、実際に実行するアルゴリズムを設計します

于 2013-01-23T19:01:11.110 に答える
0

このコードを試してください:

#include <iostream>
using namespace std;
int sumf(int row,int sum){
if(row==0)     //basecase which ends the recursion.
return sum;
else
{sum=row+sum;
return sumf(--row,sum);   // repeating the process.
}}
int main() {
    cout<<"sum is: "<<sumf(5,0)<<endl;
system("pause");
    return 0;
    }

これは再帰について理解するためのビデオです。

http://www.youtube.com/watch?v=sNJQrtGD1Nc

于 2013-01-23T19:07:20.890 に答える