2013-05-27 109 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變量來更改代碼。

對不起,我的英語不好。英語不是我的母語。 謝謝。