2016-12-01 31 views
2

我被分配了funct()并被告知将其转换为尾递归,所以我做了funct2()。我使用另一个堆栈溢出thread开始,它有用,但它始终是一个值。我不知道如何纠正我的尾递归(最初的规则递归)

认为问题是由于ÿ值为0最初,和去其他功能的部分时,减去从而不是等同于初始值x。但我不确定。

#include <iostream> 
#include <stdio.h> 
using namespace std; 
int funct(int x); 
int funct2(int x, int y); 

int main() { 

    int x = 24; 

    printf("%d %d", funct(x), funct2(x, 0)); 


} 

int funct(int x) { 

    if (x <= 0){ 
     return 0; 
    } 
    else if (x & 0x01){ 
     return x + funct(x-1); 
    } 
    else { 
     return x - funct(x-1); 
    } 

} 

int funct2(int x, int y) { 

    if (x < 0){ 
     return 0; 
    } 
    else if (x == 0){ 
     return y; 
    } 
    else if (x & 0x01){ 
     return funct2(x-1, y+x); 
    } 
    else { 
     return funct2(x-1, y-(x-1)); 
    } 

} 

任何帮助表示赞赏。多谢你们!

+0

尾递归不是C语言级别的功能,所以如果你编译器做了一些奇怪的事情,不增加尾部调用的堆栈级别......这将是一个特定的优化.. 。除非你用goto和标签写......它是C级结构,邪恶,邪恶的结构。 –

回答

1

看看this great explanation。由于递归步骤不是关联的,因此只有两个参数不能实现尾递归。考虑通过三个:

int tailrec(int x, int k, int acc) 
    { 
     if (x < 0) { 
      return acc; 
     } 
     if (k & 0x01) { 
      return tailrec(x - 1, k + 1, k + acc); 
     } else { 
      return tailrec(x - 1, k + 1, k - acc); 
     } 
    }