C# 复杂递归函数
主程序C# 复杂递归函数,c#,recursion,C#,Recursion,主程序 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); } } 答案是8。但谁能解释一下原因吗?它把我弄糊涂了
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);
}
}
答案是8。但谁能解释一下原因吗?它把我弄糊涂了,因为它称自己为2x。它归结起来如下:
int a = 6;
look lk = new look();
int r = lk.takeALook(a);
Console.WriteLine("r is" + r);
下面是一个以树的形式显示递归的小图片。修剪已经计算过的孩子们只是用一个跟踪程序修改了你的程序,这个跟踪程序对于任何递归函数来说都非常方便
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
结果:
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);
}
带上debugger看看你自己。你没听说过斐波那契数吗:你所做的就是写斐波那契序列。@Konstantin是的,我知道斐波那契序列,但我对函数本身的逻辑以及如何使其易于理解感到困惑。我试着调试,但不明白。太好了!谢谢你真的知道如何让它简单易懂:)
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)