递归函数返回意外结果

时间:2010-06-30 11:47:12

标签: c++ c

我的功能从用户输入一个数字,并递归地将数字“n”加到一个。
输入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:/任何人都可以帮忙吗?

6 个答案:

答案 0 :(得分:5)

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

return recursion(num,sum);

而不是return sum

答案 1 :(得分:1)

为什么是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 = Expected 2.283334 and got 2.283334

希望这有帮助。

答案 2 :(得分:0)

float recursion(float num) {
  if( num==1) 
    return 1; 
  return (1.0/num) + recursion(num - 1);
}

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

答案 3 :(得分:0)

@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:抱歉,我不得不再次回答,因为我不知道如何添加多行代码作为评论。

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

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

  return 1 / num + recursion(num--);
}