试图找出我在这段代码中出错的地方,我意识到我一直都是1,因为这就是我在函数中传递的内容,但我还能怎样做呢?
aptitude purge rails
答案 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。