日期:2014-05-18  浏览次数:20977 次

递归看不懂
有么有大牛 表达能力强的给我讲下递归啊 是在看不懂他怎么执行的?跳来跳去
 static string Test(int i)
  {
  if (i == 10)
  {
  return i.ToString();//①
  }
  else
  {
  Test(++i);
  return i.ToString();//②
  }
  }

Console.WriteLine(Test(1)); 结果居然是2,
1.为什么第①出 return不跳出?
2.当满足条件后执行else的 ② 为什么他也不出去,++居然成了--了 ,还有他为什么减到2才执行完?条件在哪里

不单单是这个例子 就大牛们帮忙解释下关于递归或许更麻烦的例子

------解决方案--------------------
C# code

        static string Test(int i)
        {
            if (i == 10)
            {
                return i.ToString();//①  //如果i大于10了,就不在递归了,返回i
            }
            else   //只要i的值小于10,就以++i作为参数递归,此时i的值+1了
            {
                Test(++i);
                return i.ToString();//②
            }
        }

------解决方案--------------------
探讨
这根本不算递归,方法首次传入参数是1,第一个if不满足,因为1小于10,进到else里面,++i,此时i是2,虽然再次调用了Test,但不处理返回值,而且参数值类型传入的是副本,任你里面怎么处理,外面还是不变,最后i.ToString,就是‘2’。

------解决方案--------------------
我纠正下,有些回答可能会让你理解偏差。

这个程序算递归,判断递归的原则很简单,就是看程序有没有调用自己。

其实递归没有什么神秘的,只是自己调用自己会有些让人觉得混淆。

如同
foo()
{
int i = 3;
bar(3);
}
bar(int x)
{
int i; //这个i和foo中的i无关,不难理解吧
}
一样,
如果自己调用自己,那么下一层调用内的变量和上一层也没有关系。
------解决方案--------------------
首先 你不知道对栈是否了解 每次调用 都会生产新的i在栈顶 每次return 都会让这个i退栈 但是由于i是值类型 所以说你看到的所谓i从10减到2不是在执行--操作 而是说这个i本身并没有被改变 而是在递归调用的时候传了一个复制进去 所以最终输出的只是++i的结果
------解决方案--------------------
static string Test(int i)
{
if (i == 10)
{
return i.ToString();//① //如果i大于10了,就不在递归了,返回i
}
else //只要i的值小于10,就以++i作为参数递归,此时i的值+1了
{
Test(++i);
return i.ToString();//②
}
}


------解决方案--------------------
C# code
static string Test(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test2(++i);
        return i.ToString();//②
    }
}

static string Test2(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test3(++i);
        return i.ToString();//②
    }
}

static string Test3(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test4(++i);
        return i.ToString();//②
    }
}

static string Test4(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test5(++i);
        return i.ToString();//②
    }
}

static string Test5(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test6(++i);
        return i.ToString();//②
    }
}

static string Test6(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test7(++i);
        return i.ToString();//②
    }
}

static string Test7(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test8(++i);
        return i.ToString();//②
    }
}

static string Test8(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test9(++i);
        return i.ToString();//②
    }
}

static string Test9(int i)
{
    if (i == 10)
    {
        return i.ToString();//①
    }
    else
    {
        Test10(++i);
        return i.ToString();//②
    }
}

static string Test10(int i)
{
    return i.ToString();//①
}