C++ 递归函数返回意外结果

C++ 递归函数返回意外结果,c++,c,C++,C,My funciton接受用户输入的数字,并将数字“n”递归求和为1。 输入5等于1/5+1/4+1/3+1/2+1/1 #include<stdio.h> #include<conio.h> //to float recursion(float num,float sum); void main(void) { float num=5,sum=0; //input num printf("%d",recursion(num,sum));

My funciton接受用户输入的数字,并将数字“n”递归求和为1。 输入5等于1/5+1/4+1/3+1/2+1/1

#include<stdio.h>
#include<conio.h>
//to 
float recursion(float num,float sum);
void main(void)
{
  float num=5,sum=0;
  //input num
  printf("%d",recursion(num,sum));

  getch();
}
 
float recursion(float num,float sum)
{
  // int sum=0; every time u run it the sum is assigned 0
  if( num==1)
    return 1;
  else
  {
    sum=sum+(1/num);
    num--;
    recursion(num,sum);
  }
  return sum;
}//recursion function ends

问题是,它给出了0。有人能帮忙吗?

使用sum=sum+1.0/num;。当您将1除以一个带浮点数的整数时,浮点数首先转换为整数。

使用sum=sum+1.0/num;。当您将1除以一个带浮点数的整数时,浮点数首先转换为整数。

您应该返回递归调用的结果:

return recursion(num,sum);

而不是返回总和。

您应该返回递归调用的结果:

return recursion(num,sum);
而不是返回和

顺便说一下,不要输入负数

float recursion(int num) {
  if (num == 0) {
    return 0;
  }

  return 1 / num + recursion(num--);
}
顺便说一下,不要输入负数

为什么printf%d应该打印一个浮点数?这不是显示了一个整数,使得小于0的浮点值总是0吗

float recursion(int num) {
  if (num == 0) {
    return 0;
  }

  return 1 / num + recursion(num--);
}
float recursion(float num)
{
    if( num==1.0f)
    {
        printf("1/1 = ");
        return 1.0f;
    }
    float inverse = 1.0f/num;
    printf("1/%.0f + ", num);
    return (inverse + recursion(--num));
}//recursion function ends
以下是测试代码:

float num=5,sum=0;
float expected = 0;
for (int i = 1; i <= num; ++i)
{
    expected += 1.0f/i;
}
//input num
printf("Expected %f and got %f",expected, recursion(num));
输出: 1/5+1/4+1/3+1/2+1/1=预期为2.28334,实际为2.28334

希望这有帮助。

为什么printf%d应该打印一个浮点值?这不是显示了一个整数,使得小于0的浮点值总是0吗

float recursion(float num)
{
    if( num==1.0f)
    {
        printf("1/1 = ");
        return 1.0f;
    }
    float inverse = 1.0f/num;
    printf("1/%.0f + ", num);
    return (inverse + recursion(--num));
}//recursion function ends
以下是测试代码:

float num=5,sum=0;
float expected = 0;
for (int i = 1; i <= num; ++i)
{
    expected += 1.0f/i;
}
//input num
printf("Expected %f and got %f",expected, recursion(num));
输出: 1/5+1/4+1/3+1/2+1/1=预期为2.28334,实际为2.28334


希望这能有所帮助。

@fahad:代码中的更改已在下面的代码中注释:

float recursion2(float num,float sum)
{
    // int sum=0; every time u run it the sum is assigned 0
    if( num==1)
        // Vite Falcon: Needs to return sum + 1
        return sum + 1.0f;
    else
    {
        // Vite Falcon: This is not really necessary.
        //sum=sum+(1/num);
        float inverse = 1.0f/num;
        num--;
        // Vite Falcon: The new sum is returned by the recursive function and so
        // should be stored and returned.
        sum = recursion2(num,sum + inverse);
    }
    return sum;
}//recursion function ends

PS:抱歉,我不得不再次回答,因为我不知道如何添加多行代码作为注释。

@fahad:您代码中的更改已在下面的代码中注释:

float recursion2(float num,float sum)
{
    // int sum=0; every time u run it the sum is assigned 0
    if( num==1)
        // Vite Falcon: Needs to return sum + 1
        return sum + 1.0f;
    else
    {
        // Vite Falcon: This is not really necessary.
        //sum=sum+(1/num);
        float inverse = 1.0f/num;
        num--;
        // Vite Falcon: The new sum is returned by the recursive function and so
        // should be stored and returned.
        sum = recursion2(num,sum + inverse);
    }
    return sum;
}//recursion function ends


PS:很抱歉,我不得不再次回答,因为我不知道如何添加多行代码作为注释。

在问题正文中陈述您的问题,这样您的问题就不会结束。您是否尝试检查调试器中发生的情况?有一个小错误。但在问这样的问题之前,你应该试着自己解决它。@spender,这有关系吗?他显然是在自己尝试,遇到了问题。他没有要求我们为他做作业。从上面的函数中得到的答案是0.2,但由于您使用%d打印它,它会占用它的整数部分,因此得到0。要查看正在工作的实现,请检查我的答案。什么是函数?这是一个新的comp-sci-thang吗,像单子和函子一样?在问题的主体中陈述你的问题,这样你的问题就不会被关闭。你试过检查调试器中发生了什么吗?有一个小错误。但在问这样的问题之前,你应该试着自己解决它。@spender,这有关系吗?他显然是在自己尝试,遇到了问题。他没有要求我们为他做作业。从上面的函数中得到的答案是0.2,但由于您使用%d打印它,它会占用它的整数部分,因此得到0。要查看正在工作的实现,请检查我的答案。什么是函数?这是一个新的comp-sci-thang吗,如单子和函子?并且%d应该更改为%f.+1。我认为这至少是OP面临的更大问题之一。除法没有问题。@tanacius,但我认为函数只返回1个值,但答案不是0.2,应该是2。28@fahad ... 是的。您只需删除行返回和;因为它永远无法到达。现在您只计算了1/5,即0.2,显示为0,因为您使用的是%d而不是%f,并且%d应更改为%f.+1。我认为这至少是OP面临的更大问题之一。除法没有问题。@tanacius,但我认为函数只返回1个值,但答案不是0.2,应该是2。28@fahad ... 是的。您只需删除行返回和;因为它永远无法到达。现在,您只计算1/5,即0.2,显示为0,因为您使用%d而不是%fI。请相信,在给定浮点操作数和整数操作数时,除法运算符将自动返回浮点结果。请参阅“提升/表示”部分。我相信除法运算符,当给定浮点操作数和整数操作数时,将自动返回浮点结果。请参阅“提升/表示”部分。由于整数除法的原因,这将始终返回0。这实际上是使用num和num的未定义行为-它们之间没有序列点。即使不是,它也不会做你想做的事情,因为num在每次递归调用中都是相同的。可以肯定的是,由于整数除法,它总是返回0。这实际上是使用num和num的未定义行为-它们之间没有序列点。即使不是,它也不会做您想要的事情,因为num在每个递归调用中都是相同的。