递归-n个自然数之和
Recursion- sum of n natural number
计算n个自然数之和的函数
int solve(int n)
{
if(n==0 or n==1)
return n;
int sum=0;
sum=sum+n;
solve(n-1); // gives me wrong output
return sum;
}
int solve(int n)
{
if(n==0 or n==1)
return n;
int sum=0;
sum=sum+solve(n-1); // gives me correct output
return sum;
}
函数的工作或输出有何不同,因为调用堆栈在两种情况下的工作方式相同
这两个函数有很多共同点。
因为参数类型是int,所以可以用负参数调用函数。在这种情况下,您会得到毫无意义的结果。
累加数字总和的变量类型应大于 int 类型以避免溢出。
第一个函数总是return在函数的第一次递归调用中传递的参数值。
此声明
solve(n-1); // gives me wrong output
没有效果,因为未使用 returned 值。
由于此语句
,第二个函数总是 returns 0 或 1(前提是传递了 non-negative 参数)
if(n==0 or n==1)
return n;
因为在这段代码中
int sum=0;
sum=sum+solve(n-1); // gives me correct output
未使用参数的当前值。
好像有错字,应该这样写
sum = n + solve(n-1); // gives me correct output
函数可以按照下面的演示程序所示的方式声明和定义。
#include <iostream>
unsigned long long sum( unsigned int n )
{
return n == 0 ? 0 : n + sum( n - 1 );
}
int main()
{
std::cout << sum( 100 ) << '\n';
return 0;
}
程序输出为
5050
函数中的return语句也可以这样写
return n < 2 ? n : n + sum( n - 1 );
为了减少递归调用的次数,可以按以下方式重写函数
#include <iostream>
unsigned long long sum( unsigned int n )
{
return n < 2 ? n : sum( n - 2 ) + n + n - 1;
}
int main()
{
std::cout << sum( 100 ) << '\n';
return 0;
}
solve
第一种方法中的函数在你的程序中没有任何作用
int solve(int n)
{
if(n==0 or n==1)
return n;
int sum=0;
sum=sum+n;
solve(n-1); // has not any effect
return sum;
}
在第二种方法中,returned 值将始终为 1,而它必须 return 数字的总和,计算数字总和的正确代码是:
int solve(int n)
{
if (n == 0 || n == 1)
return n;
int sum = 0;
sum = n + solve(n - 1); // change 'sum' with 'n'
return sum;
}
运行:
solve(5);
输出:
5 + 4 + 3 + 2 + 1 = 15
计算n个自然数之和的函数
int solve(int n)
{
if(n==0 or n==1)
return n;
int sum=0;
sum=sum+n;
solve(n-1); // gives me wrong output
return sum;
}
int solve(int n)
{
if(n==0 or n==1)
return n;
int sum=0;
sum=sum+solve(n-1); // gives me correct output
return sum;
}
函数的工作或输出有何不同,因为调用堆栈在两种情况下的工作方式相同
这两个函数有很多共同点。
因为参数类型是int,所以可以用负参数调用函数。在这种情况下,您会得到毫无意义的结果。
累加数字总和的变量类型应大于 int 类型以避免溢出。
第一个函数总是return在函数的第一次递归调用中传递的参数值。
此声明
solve(n-1); // gives me wrong output
没有效果,因为未使用 returned 值。
由于此语句
,第二个函数总是 returns 0 或 1(前提是传递了 non-negative 参数)if(n==0 or n==1)
return n;
因为在这段代码中
int sum=0;
sum=sum+solve(n-1); // gives me correct output
未使用参数的当前值。
好像有错字,应该这样写
sum = n + solve(n-1); // gives me correct output
函数可以按照下面的演示程序所示的方式声明和定义。
#include <iostream>
unsigned long long sum( unsigned int n )
{
return n == 0 ? 0 : n + sum( n - 1 );
}
int main()
{
std::cout << sum( 100 ) << '\n';
return 0;
}
程序输出为
5050
函数中的return语句也可以这样写
return n < 2 ? n : n + sum( n - 1 );
为了减少递归调用的次数,可以按以下方式重写函数
#include <iostream>
unsigned long long sum( unsigned int n )
{
return n < 2 ? n : sum( n - 2 ) + n + n - 1;
}
int main()
{
std::cout << sum( 100 ) << '\n';
return 0;
}
solve
第一种方法中的函数在你的程序中没有任何作用
int solve(int n)
{
if(n==0 or n==1)
return n;
int sum=0;
sum=sum+n;
solve(n-1); // has not any effect
return sum;
}
在第二种方法中,returned 值将始终为 1,而它必须 return 数字的总和,计算数字总和的正确代码是:
int solve(int n)
{
if (n == 0 || n == 1)
return n;
int sum = 0;
sum = n + solve(n - 1); // change 'sum' with 'n'
return sum;
}
运行:
solve(5);
输出:
5 + 4 + 3 + 2 + 1 = 15