2017-03-03 90 views
0

我尝试编写一个返回数字总和的递归函数。但是,下面的程序似乎没有办法。数字的递归函数总和R

getSum = function(i) { 
    if (i < 0) {Print("Please enter a positive number")} 
    if (i >= 0) {getSum(i - floor(i/10) - i %% 10) + floor(i/10) + i %% 10} 

它提供了两个错误:

Error: evaluation nested too deeply: infinite recursion/options(expressions=)? 
Error during wrapup: evaluation nested too deeply: infinite recursion/
options(expressions=)? 

有人能帮助我吗?

+0

基本调试技术展示:想通过简单的情况。假设你调用'getSum(1)',会发生什么? getSum(0)'怎么样?我建议你只需要解决这个问题,但是你也可以在你的函数中添加一些'print'语句来帮助你检查你的工作。 – Gregor

+3

另外,spacepace可以提高代码的可读性。 – Gregor

+0

我想我明白了:getSum(0)会最终发生,它会继续递归。然后它仍然不会工作。 – Cardinal

回答

1

在R,它建议使用Recall用于创建一个递归函数。

我使用@ d.b的功能,但Recall

getSum = function(i) 
{ 
    if (nchar(i) == 1){ 
    return(i) 
    } else if (i < 0) { 
    "Please enter a positive number" 
    }else { 
    print(i) 
    Recall(i = floor(i/10)) +i%%10 
    } 
} 

getSum(0) 
# [1] 0 
getSum(1) 
# [1] 1 
getSum(-1) 
# [1] "Please enter a positive number" 
getSum(5) 
# [1] 5 
getSum(100) 
# [1] 100 
# [1] 10 
# [1] 1 
getSum(23) 
# [1] 23 
# [1] 5 
2

使用此

if (i >= 0) 
{sum(sapply(strsplit(as.character(i),""),as.numeric))} 

当然,这适用于整个数字。如果您的需求更大,可以添加更多的正则表达式来适应这种情况

已编辑!哎呀完全错过了你想要的递归功能

+0

是的!但是这看起来也很好。谢谢! – Cardinal

+0

谢谢!此外,我仍然没有足够的观点来评论d.b的出色答案,但需要进行修改。 i %% 10应该在递归之外。 getSum(floor(i/10))+ i %% 10 – DashingQuark

2

你想要这样的东西吗?

getSum = function(i){ 
    i = abs(floor(i)) 
    if (nchar(i) == 1){ 
     return(i) 
    } else { 
     getSum(floor(i/10)) +i%%10 #Minorpt (suggested by @DashingQuark) 
    } 
} 
+1

优秀答案d.b.快速编辑。 i %% 10应该在递归之外。 getSum(地板(I/10))+ I %% 10 – DashingQuark