2017-04-18 49 views
0

我写了一个java递归函数来得到一个数字的总和,如下所示,总和也应该是单位数。我在这里面临的问题是应该返回else部分在结尾因为它是给之后如果其他条件return语句:响应不同值的递归函数

static int recSum(int n){ 
    int sum = 0; 
    while(n!=0){ 
     sum += n%10; 
     n = n/10; 
    } 

    if(sum>9) { 
     recSum(sum); 
    } 
    else { 
     return sum; 
    } 
     return sum ; 

}

让我们假设N = 12345所以它需要返回5月底在那里,因为它是返回14.但是它会到其他部分,但正确的值不返回。我用三元运算符得到了解决方案,而没有其他循环。但想什么是我收到的14以前和这样做的原因,而5(5来自14 = 1 + 4)

欣赏这个

+0

我不知道为什么在某些控制路径上放弃recSum的返回值。另请注意,Java函数参数是按值传递的。清楚地写下问题imho。我不明白downvote。 – Bathsheba

+0

@ Umadhar,递归方法中的'while'循环正在使其迭代运行,并消除了递归的目的。检查我更正的答案。谢谢。 –

+0

在'if'中,你计算'recSum(sum)',但从不对结果做任何事情。你的意思是把它的值赋给'sum'?请记住,Java是_never_传递引用,所以如果你调用'recSum(sum)',那么recSum调用中的'n'是'sum'的一个拷贝 - 并且不会像调用者那样修改它被关注到。 – yshavit

回答

1

回应,你应该做的改变是相当简单:你应该删除最后一个return声明,就回到递归调用的结果:

static int recSum(int n){ 
    int sum = 0; 
    while(n!=0){ 
     sum += n%10; 
     n = n/10; 
    } 

    if(sum>9) { 
     return recSum(sum); 
    } 
    else { 
     return sum; 
    } 
} 
+0

如果我没有return语句,编译错误。 – UM1979

+0

@UmadharM看看我发布的代码。 'if'和'else'都有'return'语句。 –

+0

@UmadharM它应该编译得很好,如果没有,也许你的编译器已经过时了。 只要你有返回recSum(sum),你总是可以保留最后的return语句; – Mart10

0

当此功能得到if语句和调用函数再次15被保存在堆栈上,直到当前呼叫完成后,当前的通话结束时,以前的回答是15,所以它返回,因为你不修改无论如何它在返回之后。

+0

我明白你在说什么,但是一旦递归调用完成,它会在内部修改总和,请你详细说明一下吗? – UM1979

0

这是一个迭代的方式(而不是在你的程序建立递归的好办法)

while (n != 0) { 
     sum += n % 10; 
     n = n/10; 
    } 

这是正确的递归的方式,甚至为0和负数的作品。

static int recSum(int n) { 
    int sum = 0; 

    sum = sum + (n % 10); 
    n = n/10; 

    if (n != 0) { 
     return sum + recSum(n); 
    } else { 
     return sum; 
    } 
}