2013-05-27 75 views
1

假设第一个整数是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

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

这是一个**可怕的想法,使用浮点数来解决与整数有关的问题。 – 2013-05-27 05:42:34

回答

1

一部分,

的proplem是,它使打印输出= 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] 
    } 
+1

。+ ... :) :) :) .. –

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]); 
} 
您的问题
4

的proplem是,它使打印输出= 1所有时代

当然,因为你总是输出数组中的最后一个(你的程序即使在数公顷未定义的行为)。

的另一个问题是,其数据类型是最好的一个[](以最小化对至少容量?

两者可以是unsigned long long,则甚至不声明变量x和数组需要一个数组。

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; 
} 
+2

不错的答案:)... + –

+0

一个问题是它不会打印最后一个'1'。 – Rohan

+0

@Rohan这不是一个“问题”,最后一个数字是隐含的,你可以只添加'puts(“1”);'如果你觉得它丢失了。 – 2013-05-27 09:59:16

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的答案。您可以使用长整数而不是浮点数组。我认为这是一个好主意。然后,您必须通过将数组a [i]和[i + 1]替换为int变量来更改代码。

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