【问题标题】:Recursion, possible error in algo递归,算法中可能出现错误
【发布时间】:2013-05-09 12:09:18
【问题描述】:

我正在做一个简单的 C 程序,即 5 位数字的数字总和。虽然我已经使用一个简单的函数完成了它,但我也需要使用递归来完成它。我已经在网上阅读了很多关于这个问题的解决方案使用递归并实现了我的一个。但这会出错,我无法弄清楚我在算法中正在做什么。

#include<stdio.h>
int sum5(int x);  //function for sum of  digits of 5 digit number

int main()
{
   int x;
   int result;
   printf("Enter a 5 digit number : ");
   scanf("%d",&x);
   printf("Number entered by you is %d",x);
   result = sum5(x);
   printf("Sum of digits of 5 digit number is = %d",&result);
   return 0;
}

int sum5(int x)
{
   int r;
   int sum=0;
   if(x!=0){
      r=x%10;
      sum=sum+r;
      x=x-r;      //doing this so that 0 come in the last and on diving it by 10, one digit will be removed.
      sum5(x/10);
   }
   return sum;
}

但在执行后我得到了错误的结果。它在输出上转储了一些匿名值。

【问题讨论】:

  • 这部分没用 x=x-r;因为您之后发送的内容无论如何都会删除最右边的数字。它不会起作用,因为没有人从递归调用中获得返回值。

标签: c algorithm recursion


【解决方案1】:

另外,您的sum5 函数不正确。您必须将sum5 的值添加到调用函数的sum 变量中。

int sum5(int x)
    {
        int r;
        int sum = 0;
        if (x != 0) {
            r = x % 10;
            sum = r;
            //x = x - r;  - this isn't required. integer division will floor x
            sum += sum5(x / 10);
        }
        return sum;
    }

【讨论】:

  • @0A0D: 我用我的代码试过了,基本上是 &result 错误,我没有添加递归的结果。但现在它工作正常
【解决方案2】:

这是不正确的,因为它打印的是result地址,而不是它的值:

printf("Sum of digits of 5 digit number is = %d",&result);

改为:

printf("Sum of digits of 5 digit number is = %d", result);

始终检查scanf() 的结果以确保读取了有效值:

/* Returns number of assignments made. */
if (scanf("%d", &x) == 1 && x > 9999 && x < 100000)
{
}

加上Osiris 指出的sum5() 实现中的错误。

【讨论】:

  • 是的,尽管 &result 是一个愚蠢的错误。而且 if(scanf("%d",&x)==1){} 发现这非常有用。
猜你喜欢
  • 2015-07-12
  • 2020-09-05
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2018-09-10
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多