编辑:不是家庭作业,我试图解决过去几年的考试,只是学习。
我有这个功能,想知道采取什么步骤将它转换成递归的。
这是我的功能,它将N个第一个奇数加起来:
4^2 = 1+3+5+7 = 16;
int quadIT(int n){
int x=0;
int z=1;
int y=n;
while(y>0){
x+=z;
z+=2;
y--;
}
return x;
}
上述功能可能不是最好的方法。
我很感激这里的任何帮助。
答案 0 :(得分:5)
我不想给你一个直接的回答,而是向你展示如何做到这一点。 这两个是等价的:
int foo(int n){
if (n == 0){
return something
} else {
do something
return foo(n-1);
}
}
while(n > 0){
do something
n--;
}
答案 1 :(得分:1)
将迭代转换为递归时,请查看循环变量。在这种情况下,这是您的变量y
。使其成为递归函数的参数。接下来,查看在迭代循环时发生变化的其他变量,并将它们作为参数。此时,你应该将你的功能声明放下来:
int quatItRecursive(int y, int x, int z) {
...
}
现在您已准备好处理函数体。从基本情况开始,考虑循环未启动时得到的结果(即n
为零时)。在这种情况下,您的函数返回x
。所以现在你有了基本情况:
int quatItRecursive(int y, int x, int z) {
if (y == 0) {
return x;
}
...
}
要完成正文,请添加递归步骤,即执行循环步骤的调用。它现在是一个递归调用,其参数等于循环的下一次迭代中的变量:
int quatItRecursive(int y, int x, int z) {
if (y == 0) {
return x;
}
return quatItRecursive(y-1, x + z, z + 2);
}
最后,添加一个包含单个参数的包装器,就像原始函数一样:
int quantIT(int n) {
return quatItRecursive(n, 0, 1);
}
答案 2 :(得分:0)
你需要将问题分解为使用自身的缩减版本,加上一些额外的位。在这种情况下,前N个奇数的总和是前N-1个奇数的总和加上你可以计算的数量。
所以
int sum_odd(int n)
{
if (!n) return 0;
return sum_odd(n-1) + some_calculation_here;
}
答案 3 :(得分:0)
int quadIT(int n)
{
if ( n == 1 )
{
return 1;
}
else
{
return ((2*n)-1 + quadIT(n-1));
}
}
答案 4 :(得分:0)
递归函数可以通过以下方式定义
#include <iostream>
unsigned long long quadIT( unsigned long long n )
{
return n == 0 ? 0 : 2 * n - 1 + quadIT( n - 1 );
}
int main()
{
for ( unsigned long long i = 0; i < 10; i++ )
{
std::cout << quadIT( i ) << std::endl;
}
}
输出
0
1
4
9
16
25
36
49
64
81
考虑到函数参数应该定义为某些无符号整数类型。否则该功能将更加复杂。