参数错误的递归方法

时间:2014-02-01 01:36:46

标签: java recursion

这是我对一个问题的回答,其中我应该将迭代方法转换为递归方法。老师告诉我,我不能使用a-=1作为参数......所以他们给了我0分。 当我运行它时,它应该工作,因为它应该是.. 有人能告诉我为什么会出错吗?

public int do(int a){

    if(a==0){
        return 1 ;
    }else{
        return a * do(a-=1);
    }
}

2 个答案:

答案 0 :(得分:4)

您的代码的问题在于您正在读取a的值并在同一表达式中将其与a -= 1重新分配,但未指定这些操作的顺序。声明:

return a * do(a -= 1);

可以实现为:

temp = a;
a -= 1;
return temp * do(a);

会做你可能期待的事情,或者:

a -= 1;
return a * do(a);

将乘以a的递减值而不是其原始值。

编写函数的正确方法是:

public int do(int a){

    if(a==0){
        return 1 ;
    }else{
        return a * do(a-1);
    }
}

只需将减法结果作为参数传递,不要同时重新分配变量。

答案 1 :(得分:1)

我认为这是在java?

我看到这个片段存在两个大问题。

  1. do是保留关键字。它可能会导致编译错误,因此您应该为其他方法命名。
  2. 在参数调用中执行-=似乎非常含糊不清。否定运算符会在乘以a之前或之后运行吗?更明确的运算符只是-运算符,它将完成相同的结果。
  3. 也就是说,这样的事情可能就是老师所寻求的:

    public int calculateSomething(int a) {
        if (a == 0) {
            return 1;
        } else {
            return a * calculateSomething(a - 1);
        }
    }