【问题标题】:Sum of factorials of 1 to n using only one recursive function仅使用一个递归函数的 1 到 n 的阶乘总和
【发布时间】:2015-08-04 19:00:42
【问题描述】:

我需要一个递归函数来计算序列S=1! + 2! + 3! + ...+n!

我已经使用 2 个函数完成了。

void main()
{ 
  int terms=4;
  printf(sum(terms));  //outputs 33
 /* 
    terms is the number of terms in the series
    e.g. terms=3 outputs 9, 4 outputs 33
 */
}

int fac(int n)   
{            
     return n<2 ? 1 : n * fac(n-1) ;
}   
int sum(int terms)   
{     
     return terms>0 ? (fac(terms) + sum(terms-1)):0 ;
}

【问题讨论】:

  • 使用循环执行选项之一?
  • 您应该使用您正在使用的语言添加标签。
  • @anindya dutta -- 没有迭代,只有递归

标签: java c++ c recursion factorial


【解决方案1】:
int main() {
   sum(1,terms,1,0);
}

int sum (int cur, int terms, int fac, int sumcur) {

    return terms == n? sumcur: sum(cur+1, terms, (cur==1)?1:cur*fac, sumcur+cur*fac);
}

【讨论】:

  • 不能在sum()的body里面也静态声明fact[],免去外部初始化的需要吗?
  • 不应该在函数here 中声明static 变量的原因。
  • 哦,我在想 C/C++,而不是 Java。
  • 我删除了数组。编辑它。 :)
【解决方案2】:

你可以有这样的东西:

int sumOfFac(int currentNumber, int lastSum, int lastFac, int maxNumber)
{
    int currentFac = currentNmber*lastFac;
    int currentSum = lastSum+currentFac;

    if(currentNumber < maxNumber)
    {
        return sumOfFac(currentNumber+1, currentSum, currentFac, maxNumber);
    }
    return currentSum;
}

然后你第一次调用那个函数:

currentNumber = 1
lastSum = 0
lastFac = 1
maxNumber = your n

【讨论】:

    【解决方案3】:
    a_1 = 1!
    a_2 = 1!+2!
    ...
    a_n = a_(n-1) + f_(n-1)*n
    

    在哪里f_i = i!。所以基本上我们需要来自函数的两个输出 - af。让我们把它翻译成代码:

    int series(int n, int *f)
    {
        int a, f1;
        if (n < 2)
        {
            *f = 1;
            return 1;
        }
        else
        {
            a = series(n-1, &f1);
            *f = f1 * n;
            return a + (*f);
        }
    }
    

    然后

    int main(void) {
        int dummy;
        printf("%d\n", series(1, &dummy));
        printf("%d\n", series(2, &dummy));
        printf("%d\n", series(3, &dummy));
        printf("%d\n", series(4, &dummy));
        return 0;
    }
    

    打印这个:

    1
    3
    9
    33
    


    更新:
    为了进一步重构,我们可以说f_n = a_n - a_(n-1),所以f_(n-1) = a_(n-1) - a_(n-2)。那么递归情况将是:

    a_n = a_(n-1) + (a_(n-1) - a_(n-2))*n
    

    这不需要计算f,但需要一些额外的bse情况和额外的递归调用:

        int series(int n)
        {
            int a1, a2;
            if (n <= 1)
            {
                return 1;
            }
            else if (n==2)
            {
                return 3;
            }
            else
            {
    
                a1 = series(n-1);
                a2 = series(n-2);
    
                return a1 + (a1 - a2)*n;
            }
        }
    

    【讨论】:

      【解决方案4】:

      这是我能得到的最简单的:

      int sum_fac(int target, int counter) {
          return (target == counter) ? target : counter * (1 + sum_fac(target, counter + 1));
      }
      

      当这样调用时:

      int main() {
        for (int i = 1; i < 10; i++) {
          printf("%d: %d\n", i, sum_fac(i, 1));
        }
      }
      

      输出这个:

      1: 1
      2: 3
      3: 9
      4: 33
      5: 153
      6: 873
      7: 5913
      8: 46233
      9: 409113
      

      【讨论】:

      • @user207421 似乎target 参数在main 函数的for 循环的每次迭代中提供了不同的值。
      【解决方案5】:

      c语言代码

      #include<stdio.h>
      
      int main(){
        int n;
        printf("Until how many terms?\n");
        scanf("%d",&n);
        printf("The sum of factorials is %d",srs(n));    
        return 0;
      }
      
      int factorial(int n){
        return n<2?1:n*factorial(n-1); //(if)?(true):(false)
      }
      
      int srs(int n){
        return n>0?( (factorial(n)) + srs(n-1)):0; //(if)?(true):(false)
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 2019-08-06
      • 1970-01-01
      • 2015-04-16
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2018-10-16
      相关资源
      最近更新 更多