是否可以让递归函数调用 C++ 中的另一个函数?

Posted

技术标签:

【中文标题】是否可以让递归函数调用 C++ 中的另一个函数?【英文标题】:Is it possible to have a recursive function call another function in C++? 【发布时间】:2022-01-03 08:58:26 【问题描述】:

我正在努力完成我的 C++ 课程的期末项目。我将尝试解释这一点,因为它有点令人困惑。我正在创建一个在线购物车。我是初学者,所以我想知道递归函数是否可以调用外部函数?我有一个带有 for 循环的函数,可以计算向量的总和,但我们的指令是创建一个递归函数。此外,for 循环调用了另一个函数。这可以在递归函数中完成吗?我们必须将它们放入单独的文件中。 2 个名为 ShoppingCart 和 ItemToPurchase 的头文件。 2 个名为 ShoppingCart 和 ItemToPurchase 的 cpp 文件和 1 个主 cpp 文件。

类内 ShoppingCart.h 文件中 PrintTotal() 和 GetCostofCart() 的函数声明:

class ShoppingCart 
public:
    ShoppingCart();

    double GetCostofCart();

    void PrintTotal();

private:
    vector< ItemToPurchase > cartItems;
;

ShoppingCart.cpp 中用于打印总计的函数定义:

void ShoppingCart::PrintTotal() 

    if (cartItems.size() == 0) 
        cout << "Shopping cart is empty" << endl;
    
    for (int i = 0; i < cartItems.size(); i++) 
        cartItems.at(i).PrintItemCost();
        cout << " " << endl;  
    
    cout << "Total: $" << GetCostofCart() << endl;

在 ShoppingCart.cpp 中 GetCostofCart() 的函数定义:

double ShoppingCart::GetCostofCart() 

    int costofCart = 0;

    for (int i = 0; i < cartItems.size(); i++) 
        costofCart += cartItems.at(i).GetPrice() * cartItems.at(i).GetQuantity();
    
    return costofCart;

类内ItemtoPruchase.h文件中的函数声明:

class ItemToPurchase 
public:
    ItemToPurchase();

    void PrintItemCost();

private:
    double itemPrice;
    int itemQuantity;
;

ItemToPurshcase.cpp文件中的函数定义打印物品成本:

void ItemToPurchase::PrintItemCost() 
    cout << itemName << " " << itemQuantity;
    cout << " @ $" << itemPrice;
    cout << " = $" << itemPrice * itemQuantity << endl;

main.cpp 中调用 PrintTotal 的函数:

 void OutputCart(ShoppingCart& cart) 

    cout << endl;
    cout << "OUTPUT SHOPPING CART" << endl;
    cout << endl;
    cart.PrintTotal();

根据用户输入在 if/else if 语句中调用函数:

        else if (userChoice == 'o') 
            cout << customerName << "'s Shopping Cart" << endl;
            cout << "Today's Date: " << currentDate << endl;
            OutputCart(cart);
        

我已经尝试了许多不同的方法来做到这一点,但我没有成功。我曾尝试在互联网上搜索解决方案,但找不到一个很好的例子。我想知道这是否可能,如果可以,该怎么做。

提前致谢!

【问题讨论】:

一般来说,是的;任何函数都可以调用任何函数,包括它自己。所以可能还有其他问题,但你的问题并没有真正弄清楚它是什么。 你能把它变成minimal reproducible example:一个小但可编译的程序来演示问题(如果可能的话,只在一个文件中),以及对问题的解释(确切的错误消息或描述不正确的行为)。 是的,有可能;递归函数对它们可以调用的其他函数没有特殊限制。不过,我在您发布的代码中看不到任何递归函数。 在调试器中遍历它会发生什么? 递归非常不适合计算购物车总数之类的事情。显示作业的确切措辞可能是个好主意,以防万一您解释不正确。 【参考方案1】:

是的,有可能,没有限制,如 cmets 中所述。 但是,正如 cmets 中所述,我在您的代码中没有看到递归函数。我猜你想从GetCostOfCart 创建一个递归函数。实现此目的的一种方法如下:

double ShoppingCart::GetCostofCart(int current_item) 
    // termination
    if (current_item == cartItems.size())
        return 0;
    
    // recursion
    else 
        return cartItems.at(current_item).GetQuantity() * cartItems.at(current_item).GetPrice() + GetCostofCart(current_item + 1);
    

每个函数调用负责将汽车列表中一个条目的价格添加到总价格中。但是,请注意函数签名已更改(它现在需要一个 int 参数)。只需使用参数 0 调用此函数,它就会调用自身并计算总价。

也许有一些this 丢失了,我必须仔细检查。但是,无论如何,递归函数调用在技术上与常规函数调用没有什么不同。 https://www.geeksforgeeks.org/recursion/

【讨论】:

谢谢,这正是我需要的!

以上是关于是否可以让递归函数调用 C++ 中的另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

函数——基本语法,嵌套匿名高阶递归函数

将 C++ 函数用作由导出的 Rcpp 函数调用的另一个 C++ 函数的参数

c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样

如何在 C++ 中的类中递归调用函数方法?

main函数可否进行递归调用

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数