Хвостовая рекурсия для расчета Harmoni c Series? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь вычислить серию Harmoni c с использованием TAIL, простое восстановление работает, но не терминальную версию. Это простая версия восстановления:

#include<stdio.h>
float calcul(int n)
{if(n==1)
return 1;
else
return (1/float(n)+(calcul(n-1)));
}
main()
{int i,n;float h,t;
t=1;
printf("type in a number :\n");
scanf("%d",&n);
printf("H(%d)= %.3f",n,calcul(n));}

это восстановление TAIL, но оно не работает:

#include<stdio.h>
float calcul(int n,float t)
{if(n<2)
return 1;
else
return calcul(n-1,t+(float(1)/float(n)));
}
main()
{int n;
float t;
t=1.00;
printf("type in a number :\n");
scanf("%d",&n);
printf("H(%d)= %.3f",n,calcul(n,t));}

Я использую c, пожалуйста, помогите мне:)

1 Ответ

0 голосов
/ 06 марта 2020

Ключевым моментом хвостовой рекурсии является то, что все рекурсивные вызовы находятся в хвостовой позиции, что не для вас (вам все равно придется делать + после рекурсивного вызова).

Исправьте это, введя аккумулятор, который вы возвращаете в базовом случае или обновляете в рекурсивном случае:

float calcul(int n) {
    return calcul(n, 1);
}

float calcul(int n, float acc) {
    if (n == 1)
        return acc;
    else
        return calcul(n-1, acc + 1 / float(n));
}
...