为什么我不能在C中返回递归函数的最后一个值?

时间:2019-12-05 01:10:36

标签: c function recursion

我一直在尝试构建一个计算最大值的递归函数,但是即使我在函数中打印时也能看到总值,也无法将值返回给主函数。你能告诉我我在哪里做错了吗?感谢您的帮助!

注意:关于我一直试图构建的内容的更多解释是:用户定义一个对象,只要用户不给出价格,我就会不断询问该对象是什么。

小例子:

succesfully sent:[1, 2]
succesfully sent:[1, 2, 3, 4]
succesfully sent:[1, 2, 3, 4, 5, 6]
succesfully sent:[1, 2, 3, 4, 5, 6, 7, 8]
succesfully sent:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

当前代码:

Define the object:  
Car  
What is Car?:  
4*Wheel+1*Frame  
What is Wheel?:  
2*Rim  
What is Rim?  
5.0  
What is Frame?:  
10.0  
Total is : 50.0  

3 个答案:

答案 0 :(得分:1)

我认为主要的问题是递归调用:result(temp_input_1, coeff, total);,它忽略了返回的结果。

两个可能的解决方案:(1)以result进行聚合,或(2)尾递归。我不确定这种情况是否适合尾递归(或这里是否有任何好处)。考虑从result原型中删除“总计”,并在循环中进行聚合(在“组件”上)。

double result(char input[], double coeff) {
   double total ;

   ...
        for(i = 0; i < k; i++)
        {
            sscanf(&temp_input[p[i]], "%lf%c%[^+]s", &coeff, &x, temp_input_1);
            total += result(temp_input_1, coeff, total);
        }

侧面注释:还可以考虑删除“ delete_space”功能。我认为它不属于字符串fix的属性。跳过scanf调用中的空格要容易得多。

答案 1 :(得分:0)

欢迎来到stackoverflow!我在这里也很陌生,但是如果您说出正确的问题,就会得到更好的答案。如果这是一项家庭作业,我强烈建议将其包括在内,这样可能很难遵循说明。

因此,作为一般经验法则,编写C函数时最好使用尽可能少的return语句。但是我对此也有困难。

您似乎正在检查

  1. 是否满足第一个条件?
  2. 如果不是,请检查下一个条件

您是否应该使用if,if else,if else?

您还具有通常不需要的if语句,尤其是在递归函数中(您可能在上次递归调用之后跳过了下一步)

希望这会有所帮助!我本学期末会被淹没,否则我会尝试解决的方法!

答案 2 :(得分:0)

要成功编写递归方法,您需要做三件事:

  1. 终止条件,以使方法不会永远调用自身,
  2. 要做的一些工作,
  3. 递归调用。

考虑以下代码:

typedef struct node{
  void* item;
  struct node* next;
} Node;

int CountNodes(Node* list)
{
    if (list == null) return 0;
    return 1 + CountNodes(list.next);
}

该代码有效,因为它计算当前节点加上所有剩余的节点。递归调用计算下一个节点和所有剩余节点。依此类推。