2013-05-27 3 views
1

Предположим, что первое целое число равно x. Тогда мы определим [0] = х, то следующие элементы последовательности вычисляются как:Рекурсия для вычисления последовательности

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 все время. Я проверил его, но я не знаю, где я ошибся. Другой вопрос, который тип данных лучше объявить для переменной х и массив а [] (для минимизации наименьшему способности? И как мы можем сделать это с помощью рекурсии?

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

Это ** ужасная идея использовать числа с плавающей запятой для решения проблем, связанных с целыми числами. –

ответ

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 (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 все время

Конечно, поскольку вы всегда выводите число после последнего в массиве (ваша программа даже ha неопределенное поведение).

Другой вопрос, который тип данных лучше объявить для переменной х и массив а [] (для минимизации наименьшему способности?

Оба могли быть 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; 
} 
+2

приятный ответ:) ... + –

+0

Одна проблема заключается в том, что он не распечатает последний '1'. – Rohan

+0

@Rohan Это не «проблема», последнее число является неявным, вы можете просто добавить 'puts (« 1 »),' если вы чувствуете, что это отсутствует. –

3

Вы просто делаете все вычисления в один цикл, а с рекурсивным образом ... заменить эту часть кода ...

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.

Извините за мой плохой английский. Английский не мой родной язык. Спасибо.

Смежные вопросы