【问题标题】:Recursion to calculate sequence递归计算序列
【发布时间】:2013-05-27 05:38:50
【问题描述】:

假设第一个整数是 x。然后我们定义a[0]=x,序列的下一个元素计算为:

a[n+1]=a[n]/2   if a[n] is even, and 
a[n+1]=a[n]*3+1 if a[n] is odd. 

The sequence continues till it reach value 1, then stop. 

看起来像这样75、226、113、340、170、85、256、128、64、32、16、8、4、2、1

这是我的代码(不使用递归)。 问题是它一直打印 output=1。我已经检查过了,但我不知道我错在哪里。 另一个问题是,哪种数据类型最适合为变量 x 和数组 a[] 声明(以最小化容量?我们如何使用递归来做到这一点?

int main(void)
{
    float a[100];
    int i=0;
    float x;
    printf("Enter the value of x: ");
    scanf("%f",&x);
    a[0]=x;
    printf("\n%f\n",a[0]);
    do{
        if (fmod(a[i],2)==0){
            a[i+1]=a[i]/2;}
        else{
            a[i+1]=a[i]*3+1;        
        }
        i++;
    } while (a[i]!=1);
    printf("The ouput value is:\n");
    for (int j=0;j<i;j++){
        printf("%2.2f\t",a[i]);
    }
    getch();
    return 0;
}

【问题讨论】:

  • 使用浮点数解决整数相关问题是一个可怕的想法。

标签: c recursion sequence


【解决方案1】:

问题是它一直打印 output=1

当然,因为你总是输出数组中最后一个数字之后的数字(你的程序甚至有未定义的行为)。

另一个问题是,哪种数据类型最适合为变量 x 和数组 a[] 声明(以最小化容量?

两者都可以是unsigned long long,你甚至不需要数组。

char buf[0x100];
fgets(buf, sizeof(buf), stdin);
unsigned long long n = strtoull(buf, NULL, 10);
while (n > 1) {
    printf("%ull\n", n);
    n = n % 2 ? 3 * n + 1 : n / 2;
}

【讨论】:

  • 一个问题是它不会最后打印1
  • @Rohan 这不是一个“问题”,最后一个数字是 1 是隐含的,如果你觉得它不见了,你可以添加 puts("1");
【解决方案2】:

您只需使用递归方式在单个 while 循环中进行所有计算...替换这部分代码...

printf("\n%f\n",a[0]);
do{
    if (fmod(a[i],2)==0){
        a[i+1]=a[i]/2;}
    else{
        a[i+1]=a[i]*3+1;        
    }
    i++;
} while (a[i]!=1);
printf("The ouput value is:\n");
for (int j=0;j<i;j++){
    printf("%2.2f\t",a[i]);
}

用类似的东西替换它....

    while(a[i] > 1){
     printf("\n%f\n",a[i]);
     if(fmod(a[i],2)==0){
       a[i+1]=a[i]/2;
     }else{
       a[i+1]=a[i]*3+1;        
     }
     i++;
    }

我没有对其进行测试,但是如果您不想使用任何外部函数进行计算,则此问题的递归主要思想应该是类似的。 这种递归方式也解决了总是打印 1 的问题。正如我所看到的,您已经得到了关于在代码中一直打印 1 的答案。您可以使用 long int 而不是浮点数组。我认为这是个好主意。然后你必须通过将数组 a[i] 和 a[i+1] 替换为 int 变量来更改代码。

对不起,我的英语不好。英语不是我的母语。 谢谢。

【讨论】:

    【解决方案3】:

    你的问题的一部分,

    问题是它一直打印 output=1

    printf("The ouput value is:\n");
        for (int j=0;j<i;j++){
            printf("%2.2f\t",a[i]); //<--- use a[j] to print instead of a[i]
        }
    

    【讨论】:

      【解决方案4】:

      它总是打印 1 的原因是你在 for 循环中使用了错误的变量

      for (int j=0;j<i;j++){
          printf("%2.2f\t",a[i]);
      }
      

      您应该访问a[j] 而不是a[i]i 在循环中是常量。您应该将其更改为

      for (int j=0;j<i;j++){
          printf("%2.2f\t",a[j]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 2011-08-07
        • 1970-01-01
        • 2014-04-12
        • 2018-08-11
        相关资源
        最近更新 更多