Вычисление суммы первых 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 шт):

Автор решения: AlexGlebe

Неправильно читаете числа и пишете. Типу 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;
}
→ Ссылка