[英]Tricky Recursive Function
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。
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
它像這樣歸結為:
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
只需使用跟蹤器修改程序,該跟蹤器對於任何遞歸函數都可能非常有用。
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)
這是一張小圖,顯示了遞歸為一棵樹。 修剪已經計算過的孩子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.