One of my favorite algorithms is finding the digital root of any given integer. A digital root is a single-digit sum that is reached when you itera...
For further actions, you may consider blocking this person and/or reporting abuse
Very cool! I'm a Ruby enthusiast so I tried it out in that.
Your Iterative strategy was great but I think using recursion could help reduce some of the complexity and make for some cleaner code.
Ruby gives us some great helpers for integers so we can simplify this even more.
Nice and simple!
Can I cheat?
:D
I am really curious how do you know this?
I learnt it first as a math trick for children in Vietnam: to know if something is divisible by 9, you calculate its digitial root and see if the digital root is divisible by 9 (same goes for 3).
When I grew up, I was curious and tried to prove that mathematically, which is how I ended up with digitalRoot(num) = num % 9 (or 9 if divisible by 9) :D
mathworld.wolfram.com/DigitalRoot....
Looking good in this corner of the thread!
What about d_root(0) ?
Amazing intuition!
Are we sure this is a recursive approach? I feel like this is an iterative solution as we just run a block until a condition is met. The function is not called multiple times.
I think this qualifies as recursive. But the iterative approach in the article is much more performant I think. Nice article.
Thank you! I like those tiny little programming "snacks" :)
shortest (recursion) solution I could find:
Cool demo, but that's not actually recursion, that's just iteration. An actual recursive solution, if you wanted to do that for some strange reason, would look more like
Also, sidenote, this function does break on very large numbers. That's not OP's fault, that's because Javascript can't reasonably represent things like 1234567891234567891234567891 as an integer.
digitalRoot("1234567891234567891234567891")
works just fine, thoughfunction F_iRoot(P_sz0){
var sz0 = "" + P_sz0;
var iLen = sz0.length;
var iNum;
var ch;
var iSum = 0;
for (var i=0; i < iLen; i++) {
ch = sz0.charCodeAt(i);
iNum = ch - 48; // '0' = 0x30 = 48
iSum += iNum;
} /* for /
if (iSum > 9) {
iSum = F_iRoot(iSum);
} / if /
return(iSum);
} / F_iRoot */
I love this post! You explain it all so well! Are you planning on creating an algo series?
thank you so much omg
The better solution I think:
function digital_root(n) {
return (n - 1) % 9 + 1;
}