【问题标题】:Why can't I return the last value of the recursive fuction in C?为什么我不能返回 C 中递归函数的最后一个值?
【发布时间】:2020-03-29 21:24:02
【问题描述】:

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

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

小例子:

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  

当前代码:

#include <stdio.h>
#include <stdlib.h>
#define INPUT_SIZE 101

void delete_space(char arr[])
{
    int a, i, j, len;
    for(a = 0; a < INPUT_SIZE; a++)
    {
        for(i = 0; i < INPUT_SIZE; i++)
        {
            if(arr[i] == ' ')
            {
                for(j = i; j < INPUT_SIZE; j++)
                {
                    arr[j] = arr[j + 1];
                }
            }
        }
    }
}


double result(char input[], double coeff, double total)
{
    /* if the input is number, num_of_obj is 0, if the input is object, num_or_obj is more than 0.
     */
    int i, k = 1, num_of_obj = 0;
    char temp_input[INPUT_SIZE];
    char temp_input_1[INPUT_SIZE];
    char x;
    int* p;
    double value;
    p = (int*)calloc(1, sizeof(int));
    p[0] = 0;
    printf("What is %s:?\n", input);
    scanf("%[^\n]s", temp_input);
    getchar();
    delete_space(temp_input);
    for(i = 0; i < INPUT_SIZE; i++)
    {
        if(temp_input[i] == '*')
        {
            num_of_obj++;
        }
    }
    if(num_of_obj == 0) // if the input is number.
    {
        sscanf(temp_input, "%lf", &value);
        total = total + coeff * value;
        printf("total : %lf", total);
        return total;
    }
    if(num_of_obj > 0)
    {
        for(i = 0; i < INPUT_SIZE; i++)
        {
            if(temp_input[i] == '+')
            {
                p = (int*)realloc(p, (k + 1) * sizeof(int));
                p[k] = i + 1;
                k++;
            }
        }
        for(i = 0; i < k; i++)
        {
            sscanf(&temp_input[p[i]], "%lf%c%[^+]s", &coeff, &x, temp_input_1);
            result(temp_input_1, coeff, total);
        }
    }
    printf("test");
    return total;
}

int main()
{
    double total = 0;
    char input[INPUT_SIZE];
    printf("Define the object :\n");
    scanf("%[^\n]s", input);
    getchar();
    delete_space(input);
    printf("total : %.2lf", result(input, 0, 0));
    return 0;
}

【问题讨论】:

  • 说实话,我不太确定你的程序在做什么。但看起来您没有使用递归 result() 调用的返回值。试试total = result(temp_input_1, coeff, total);
  • 我举了一个小例子来说明我的目标是什么。我已经尝试过你的建议,但还是一样..
  • 看起来你想创建一个表达式树来解析输入

标签: c function recursion


【解决方案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 调用中的空格要容易得多。

【讨论】:

    【解决方案2】:

    欢迎来到stackoverflow!我也是新来的,但如果你把你的问题说对了,你会得到更好的答案。如果这是家庭作业,我强烈建议包括在内,可能很难按照描述进行。

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

    看起来你正在检查

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

    您应该使用 if、if else 和 else 吗?

    你也有没有 else 的 if 语句,通常需要,尤其是在递归函数中(你可能会在最后一次递归调用后跳过下一步)

    希望这会有所帮助!我自己在学期结束时陷入困境,否则我会尝试解决方案!

    【讨论】:

      【解决方案3】:

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

      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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 2023-01-13
        • 2019-09-13
        • 2020-11-18
        • 2022-08-13
        • 1970-01-01
        • 2020-02-07
        • 2021-05-24
        • 2022-12-06
        • 2021-11-13
        相关资源
        最近更新 更多