在c ++中使用tail递归函数计算列表总和

时间:2016-01-23 12:39:28

标签: c++ recursion

我正在为我的大学做作业。我需要创建递归函数。

我的list_t界面包含以下功能:

List Interface
The file recursive.h defines the type "list_t" and the following operations on lists:
// EFFECTS: returns true if list is empty, false otherwise
bool list_isEmpty​ (const list_t& list);
// EFFECTS: returns an empty list.
list_t list_make​ ();
// EFFECTS: given the list (list) make a new list consisting of
// the new element followed by the elements of the
// original list.
list_t list_make​ (int elt, const list_t& list);
// REQUIRES: list is not empty
// EFFECTS: returns the first element of list
int list_first​ (const list_t& list);
// REQUIRES: list is not empty
// EFFECTS: returns the list containing all but the first element of list
list_t list_rest​ (const list_t& list);
// MODIFIES: cout
// EFFECTS: prints list to cout.
void list_print​ (const list_t& list);

请注意sum函数需要是尾递归的,我不能使用静态或全局变量。

直到现在我才接受这个,这给了我错误的答案:

int sum(list_t list) {
    if(list.get_rest_list().is_empty())
    return list.get_first_elt() + sum(list.get_rest_list());
}

1 个答案:

答案 0 :(得分:0)

让我们用适当的缩进重写该函数:

int sum(list_t list)
{
    if(list.get_rest_list().is_empty())
        return list.get_first_elt() + sum(list.get_rest_list());

    // what to return here?
}

除了有缺陷的逻辑之外,您还没有return语句覆盖所有控制路径,如果条件不满足,将导致返回不确定的值。

(不是这样)更正后的代码:

int sum(list_t list)
{
    if(list.get_rest_list().is_empty())
        return list.get_first_elt();

    return list.get_first_elt() + sum(list.get_rest_list());
}

如果愿意,可以使用三元运算符重写它。

但是如果你传递一个空list_t怎么办?更好地做到这一点:

int sum(list_t list)
{
    if(list.is_empty())
        return 0;

    return list.get_first_elt() + sum(list.get_rest_list());
}