使用C中的RECURSION从1到100的奇数之和

时间:2017-03-22 22:04:39

标签: c

试图找出我在这段代码中出错的地方,我意识到我一直都是1,因为这就是我在函数中传递的内容,但我还能怎样做呢?

aptitude purge rails

3 个答案:

答案 0 :(得分:1)

试试这个     一:

#include <stdio.h>
#include <stdlib.h>
int totalOdd(int);

int main(){
    printf("%d\n",totalOdd(1));
  }

   int totalOdd(int n)
{
   int odd = n;
      if(odd > 100){
          return 0;
         }
       else{
          return (n+totalOdd(odd+2));
         }
}

在您的代码中,添加内容缺失

答案 1 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

int totalOdd();

int main(){
    printf("%d\n",totalOdd(1));
}

int totalOdd(int odd){
    if(odd >= 100)
    return 0;

return (odd + totalOdd(odd + 2));

}

答案 2 :(得分:0)

不是一个完整的答案,因为这听起来像是家庭作业,但这里是一个如何编写一个非常相似的函数的例子,首先是递归的,然后是一个更有效的尾递归解决方案。

#include <stdio.h>
#include <stdlib.h>

unsigned long factorial1(const unsigned long n)
{
/* The naive implementation. */
  if ( n <= 1U )
    return 1; // 0! is the nullary product, 1.
  else
    return n*factorial1(n-1);
 /* Notice that there is one more operation after the call to
  * factorial1() above: a multiplication.  Most compilers need to keep
  * all the intermediate results on the stack and do all the multiplic-
  * ations after factorial1(1) returns.
  */
}

static unsigned long factorial_helper( const unsigned long n,
                                       const unsigned long accumulator )
{
/* Most compilers should be able to optimize this tail-recursive version
 * into faster code.
 */
  if ( n <= 1U )
    return accumulator;
  else
    return factorial_helper( n-1, n*accumulator );
 /* Notice that the return value is simply another call to the same function.
  * This pattern is called tail-recursion, and is as efficient as iterative
  * code (like a for loop).
  */
}

unsigned long factorial2(const unsigned long n)
{
  return factorial_helper( n, 1U );
}

int main(void)
{
  printf( "%lu = %lu\n", factorial1(10), factorial2(10) );
  return EXIT_SUCCESS;
}

在上面的代码中检查gcc -O -S和clang -O -S的输出,我看到在实践中,clang 3.8.1可以将两个版本编译为相同的优化循环,而gcc 6.2.0可以也没有针对尾部递归进行优化,但是有些编译器会产生差异。

为了将来参考,您不会在现实世界中以这种方式解决此特定问题,但您将使用此模式用于其他事情,尤其是在函数式编程中。对于范围内的奇数之和,存在封闭形式的解。您可以使用它来获得恒定时间的答案。你想尽可能地寻找那些!提示:它是总和,从 i = 0到100,2 i + 1.你还记得 i之和的闭式公式吗? 从0到 N ? 0,1,3,6,10,15 ......证明通常被教导作为归纳证明的一个例子。当你乘以常数并加上常数时,从0到 N 之和会发生什么?

至于我的例子,当我不得不在真实程序中计算阶乘函数时,它是为了计算模拟的概率分布(特别是泊松分布),我需要计算阶乘重复相同的数字。因此,我所做的是存储我已经计算过的所有因子的列表,并查找我在该列表中再次看到的任何数字。这种模式称为memoization。