2017-03-03 101 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