是否可以让递归函数调用 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++ 函数的参数