2017-01-09 10 views
-2

私は宿題をしているので、最初の行に1つ、2行目に2つ、というように '*'マークを書き出すプログラムを作成する必要があります。ひねりは、再帰的な方法で作られなければならない、と私は本当にそれを処理することはできません。C#唯一の再帰的メソッド

static void csillag(int i,int x = 1) 
    { 
     for (int z = 0; z < x; z++) Console.Write('*'); 
     x++; 
     while (i > x) 
     { 
      Console.WriteLine(); 
      csillag(i); 
     } 
    } 

これは私が思いついたコードですが、それはいくつかの理由のために働いていない、それは無限に各行に1つの*書き込み続けます。私はおそらく、 "int x = 1"の部分は、メソッドが実行されるたびにxを1にリセットし続けると考えました。あなたが助けてくれることを願っています、私の専門家でない英語には申し訳ありません。

+1

あなたの先生をサック。これは再帰のための恐ろしい使用であり、決してあなたに再帰の力を教えるものではありません。 –

+1

まず、 'x'引数は必要ありません。二番目に、 'if(i == 10)'や描画する必要のある最大値のように見える再帰出口の状態から始めてみることをお勧めします。ここでは完全な実用的な解決策を得られないことを願っています。ネットワーク内にたくさんの再帰サンプルがある –

+0

最大の数はユーザーでなければならないので、11を入力すると11倍になります。 –

答えて

1

まず、これは再帰関数の実際の使用例を示すためには本当に奇妙なケースですが、次の解決策が機能します。それが動作する理由、それはいい問題ではない理由を読んで最初にコピーして貼り付けないでください。

static void Main(string[] args) 
{ 
    PrintStar(1, 10); 
} 

static void PrintStar(int n, int max) 
{ 
    Console.WriteLine(new String('*', n)); 
    if (n == max) 
     return; 
    PrintStar(n + 1, max); 
} 

私はちょうど関数呼び出し悪用による単純なループを実装していますので、それが動作します。しかし、PrintStar(n)とPrintStar(n + 1)が完全に無関係なので、単純なループを不要な関数呼び出しで置き換える必要があるのはなぜですか?

注:ポイントがあれば、解決策を試してみてください。

+0

本当に助けてくれてありがとう、私は明日最初にコードを調べます。私の国ではかなり遅いです。また、再帰関数をうまく使用できない場合は、それがどこにあるのか教えていただけますか? –

+0

心配はいりません。 Factorialは良い基本的な例です。 – mok

+0

完全な[tail-recursive](http://stackoverflow.com/questions/33923/what-is-tail-recursion?rq=1)呼び出しをループに変換する理由はありません:) –