2017-03-03 17 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} 

それは2つのエラーを与える:

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

また、スペースバーは、コードの読み取りを容易にすることができます。 – Gregor

+0

私はそれを持っていると思う:それは最終的に起こるgetSum(0)が繰り返され続けます。それでもそれはまだ動作しません。 – Cardinal

答えて

1

、再帰関数を作成するため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

このようなものが欲しいですか? Rで

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(floor(i/10))+ i %% 10 – DashingQuark