Вычисление суммы первых k чисел последовательности
Вычисление суммы первых k чисел последовательности a[0] = 1, a[k] = k*a[k-1] +1/k ( k = 1, 2, ... ).
В чем проблема, почему не работает ни одна, ни другая функция?(одна без рекурсии , другая с рекурсией) (специально поменяла все типы на float , т.к. думала, что проблема в этом, но и это не помогло).
UPD : Осталась проблема с рекурсивной функцией ...В чем ошибка?
#include <stdio.h>
#include <stdlib.h>
float m(float n){
float k=1;
float sum=k;
int i;
for (i=1; i<n;i++){
k = (i*k+1.0/i);
sum = sum+k;
}
return sum;
}
float Fn(float n)
{
if (n==0) {
return 1;}
return ((n*Fn(n-1)+1.0/n)+Fn(n-1));
}
int main(int argc, char *argv[]) {
float k;
printf("input k : ");
scanf("%f",&k);
printf("res %f \n",Fn(k));
return 0;
}
Ответы (2 шт):
Неправильно читаете числа и пишете. Типу float нужно ставить %f вместо %d или %s.
scanf("%f",&k);
printf("res %f \n",m(k));
Из-за комментария Павел Ериков нужно исправить цикл в функции m :
for (i=1; i<=n;i++){
В рекурсивной функции вы считаете что Fn - это сумма, а в задаче должен быть предыдущий элемент.
return ((n* Fn(n-1) +1.0/n)+Fn(n-1));
Можно сделать две рекурсивные функции. Одна вычисляет сумму, другая элементы последовательности.
float An(float n)
{
if (n <= 0)
return 1;
return ((n*An(n-1)+1.0/n));
}
float Sn(float n) {
if(n <= 0)
return 1.0;
return Sn(n-1)+An(n); }
Приведу все таки в качестве примера, мой вариант рекурсивной функции:
float Fn(float n, float* sum)
{
if (n == 0) {
*sum += 1;
return 1;
}
float tmp = ((n * Fn(n - 1, sum) + 1.0 / n));
*sum += tmp;
return tmp;
}
Он немного эффективней чем вариант, AlexGlebe, потому-что расчет каждого слагаемого происходит лишь 1 раз.
Для этой функции можно сделать функцию обертку:
float Fn(float n) {
float sum = 0;
Fn(n, &sum);
return sum;
}