2015-10-30 2 views
0

Я новичок в рекурсии, поэтому я пытаюсь написать простую программу, которая добавляет к n-му числу серии 1/n. Поэтому, если пользователь вводит n = 4, программа добавит 1 + 1/2 + 1/3 + 1/4. Моя программа продолжает выводить, что сумма серии равна 0. Может кто-нибудь объяснить, что я делаю неправильно? Я был бы признателен за помощь. Вот мой код:C Программа: добавление серии с использованием рекурсии

#include <stdio.h> 

double sum(double n); 

int main() { 
    double n; 
    double total; 
    printf("Enter a positive integer greater than 0: "); 
    scanf("%lf", &n); 
    total = sum(n); 
    printf("Sum: %lf", total); 

    return 0; 
} 

double sum(double n) { 
    if (n == 1) 
     return 1; 
    else 
     return ((1/n) + sum(n - 1)); 
} 
+0

'(1/n)' -> '(1.0/n)' ... 'double sum (int n) {' – BLUEPIXY

+1

@ Решение Bluepixy должно работать. Я также хотел бы отметить, что двойники и равенство не смешиваются хорошо! 'if (n == 1)' может выйти из строя из-за ошибки с плавающей запятой. Вам гораздо лучше использовать неравенство. Если 'n' является' int' (как в решении @ Bluepixy), это не проблема. – Khalos

ответ

1

Проблема заключается в определении этой функции:

double sum(int n) { 
    if (n == 1) 
     return 1; 
    else 
     return ((1/n) + sum(n - 1)); 
} 

n является int так 1/n всегда будет оценен как int, так как оба 1 и n являются целыми числами. Таким образом, 1/n всегда 0 для каждого n> 1.

Решение было бы определить n, как double:

double sum(double n) { 
    if (n <= 1.0) 
     return 1.0; 
    else 
     return ((1.0/n) + sum(n - 1.0)); 
} 
1

Проверьте свой базовый чехол. sum(1) должен вернуть 1.

Кроме того, int, деленный на int, возвращает int. Используйте число с плавающей запятой в своем подразделении.

+0

О да, я не понимал, что использую int n вместо double n. Спасибо! – Pollo

+0

Вы отредактировали ваше сообщение, чтобы исправить первую ошибку. Это не лучший способ создать базу знаний полезных вопросов и ответов. :-) –

0

Он должен быть

double sum(double n) { 
if (n == 1) 
    return 1.0; 
else 
    return ((1.0/n) + sum(n - 1)); 
} 

1/п всегда будет возвращать 0, так как «п» действует как целое значение и не является float, даже если тип данных удваивается, поскольку присвоенное ему значение имеет тип integer.

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