首页新闻找找看学习计划

循环转换为尾递归的问题

0
悬赏园豆:20 [待解决问题]

斐波那契问题:

      非递归解决方法:

void FaboLoop(int n)
{
  int a=0;
  int b=1;
  int c;
  int i;


  if(n==0)
  {
    c=1;
  }
  else
  {

    if(n==1) c=1;
    else
    {

      for(i=2;i<=n;i++)
      {
        c=a+b;
        a=b;
        b=c;
      }
    }

  }
   
  printf("%d\n",c);
}

    尾递归方法:

int FaboTailRec(int n, int a, int b)
{

  if (n==0)
  {
    return a;
  }

  return FaboTailRec(n-1, b, a+b);
   
}

问题:我想找到根据非递归循环来转换成尾递归的一种方法,而上面非递归循环的方法中就用了三个参数,所以我想写一个尾递归是采用a,b,c三个参数,而不是上面两个参数的,即FaboTailRec(n, a, b,c),但是遇到了问题,

非递归中: 
      c=a+b;先执行这一句,于是FaboTailRec(n-1, , ,a+b);第

          三个参数确定

      a=b; 再执行这句,是给a赋值,但是形参是从右到左入栈的,也就是说第二个修改的值应

        该是b,但是这里要修改的是a,问题就在这里!


所以,请告诉我怎么解决这个问题,或者跟我说说循环怎么转换为尾递归的技巧

 

我自己也写了个:

int FaboTailRec(int n, int b, int a, int c)
{

if (n==0)
{
  return a;
}

return FaboTailRec(n-1, c, b, a+b);

}
这是我自己写的,但是不对,问题就在参数的传递方面,但是不知道怎么解决

xitijie的主页 xitijie | 初学一级 | 园豆:182
提问于:2012-08-26 19:23
< >
分享
所有回答(1)
0

你这个int FaboTailRec(int n, int b, int a, int c)方法目的何在啊??是做什么的啊 ??都不讲清楚

dotnet平台开发者 | 园豆:17 (初学一级) | 2012-08-27 16:14

是你自己没看清楚

支持(0) 反对(0) xitijie | 园豆:182 (初学一级) | 2012-08-27 20:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册