0
public class look
{
    public int takeALook (int a)
    {
        if (a == 1)
            return 1;
        else if (a == 0)
            return 0;
        else
            return takeALook(a-2) + takeALook(a-1);

    }
}

メインプログラム、

int a = 6;

look lk = new look();

int r = lk.takeALook(a);

Console.WriteLine("r is" + r);

答えは 8 ですが、その理由を誰か教えてください。それ自体を2xと呼んでいるので、私を混乱させています。

4

4 に答える 4

6
takeALook(0) == 0
takeALook(1) == 1
takeALook(2) == takeALook(0) + takeALook(1) == 0 + 1 == 1
takeALook(3) == takeALook(1) + takeALook(2) == 1 + 1 == 2
takeALook(4) == takeALook(2) + takeALook(3) == 1 + 2 == 3
takeALook(5) == takeALook(3) + takeALook(4) == 2 + 3 == 5
takeALook(6) == takeALook(4) + takeALook(5) == 3 + 5 == 8
于 2012-11-01T03:48:34.473 に答える
3

要約すると次のようになります。

takeALook(6) =>
(takeALook(4) + takeALook(5)) =>
(((2 + 3)) + ((3 + 4))) =>
((((0 + 1) + (1 + 2))) + (((1 + 2) + (2 + 3)))) =>
((((0 + 1) + (1 + (0 + 1)))) + (((1 + (0 + 1)) + ((0 + 1) + (1 + 2))))) =>
((((0 + 1) + (1 + (0 + 1)))) + (((1 + (0 + 1)) + ((0 + 1) + (1 + (0 + 1)))))) =>
0 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 1 =>
8
于 2012-11-01T03:47:33.290 に答える
1

再帰関数に非常に便利なトレーサーを使用してプログラムを変更しただけです。

const string space = "  ";
static string StrMultiplier(string str,int multiplier)
{
    return string.Concat(Enumerable.Repeat(str,multiplier).ToArray());
}

static int F(int a,int level = 0)
{
    Console.WriteLine("{0}->F({1})",StrMultiplier(space,level),a);//Trace line
    if (a == 1)
        return 1;
    else if (a == 0)
        return 0;
    else
        return F(a-2,level + 1) + F(a-1,level+1);

}

結果:

->F(6)
  ->F(4)
    ->F(2)
      ->F(0)
      ->F(1)
    ->F(3)
      ->F(1)
      ->F(2)
        ->F(0)
        ->F(1)
  ->F(5)
    ->F(3)
      ->F(1)
      ->F(2)
        ->F(0)
        ->F(1)
    ->F(4)
      ->F(2)
        ->F(0)
        ->F(1)
      ->F(3)
        ->F(1)
        ->F(2)
          ->F(0)
          ->F(1)
于 2012-11-01T05:14:48.317 に答える
0

これは、再帰をツリーとして示す小さな画像です。すでに計算されている子をトリミングしましたここに画像の説明を入力

于 2012-11-01T03:51:56.147 に答える