【问题标题】:I don't know how to correct my tail recursion (originally regular recursion)我不知道如何纠正我的尾递归(原来是常规递归)
【发布时间】:2016-12-01 18:27:50
【问题描述】:

我被分配了funct(),并被告知将其转换为尾递归,所以我创建了funct2()。我使用另一个堆栈溢出thread 开始,它有点工作,但它总是一个值。

认为问题是由于 y 值最初为 0,当转到函数的 else 部分时,减去从 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));
    }

}

感谢任何帮助。谢谢大家!

【问题讨论】:

  • 尾递归不是 C 语言级别的特性,所以如果你的编译器做了一些不增加尾调用的堆栈级别的事情......那将是一个特定的优化......除非你用 goto 和 labels 编写它......它们是 C 级构造,邪恶,邪恶的构造。

标签: c recursion tail-recursion


【解决方案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);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2015-09-20
    • 2016-03-21
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多