我想创建一个接收数字的函数,数字将减少到其数字的总和(16减少到7 - >返回7),直到结果只有一位数(326减少到11然后减少到2 - >返回2)。
我正在创建一个递归函数,如下所示,但是对于长度为>的数字,它返回undefined 1。
function digital_root(n) {
var numStr = (typeof n == "string") ? n : n.toString(); // ensure we will use a string
//console.log("evaluating " + numStr + "its length is " + numStr.length);
//now evaluate my base case
if (numStr.length <= 1){
console.log("i will return" + numStr)//should return my 1 digit number
return n; //it doesn't
}
else{
var arr = numStr.split(""); //convert the string into an array
var reducedArr = arr.reduce(function(a,b){
return parseInt(a) + parseInt(b);//sum the elements of the array
});
digital_root(reducedArr);//send the reduced value back for evaluation
}
}
digital_root(16)//returns undefined
我见过一些类似的questions,但它们只涉及代码而不是概念。我学习递归的方式是你有一个你评估的基本情况,如果它是真的然后返回 - 这将是递归的结束 - 如果没有,继续并运行将转换将成为的数据的代码再次送去评估。
如何避免未定义的结果,并且我的递归概念是否准确?
答案 0 :(得分:3)
return digital_root(reducedArr);
您在return
分支中缺少else
。不执行function
的{{1}}将产生return
。