递归计算序列

时间:2013-05-27 05:38:50

标签: c recursion sequence

假设第一个整数是x。然后我们定义一个[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

这是我的代码(不使用递归)。 问题在于它始终保持打印输出= 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;
}

4 个答案:

答案 0 :(得分:4)

  

问题在于它始终保持打印输出= 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 :(得分:3)

您只需使用递归方式在单个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]和[i + 1]替换为int变量来更改代码。

抱歉我的英语不好。英语不是我的母语。 感谢。

答案 2 :(得分:1)

它总是打印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]);
}

答案 3 :(得分:1)

问题的一部分,

问题是它始终保持打印输出= 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]
    }