我正在制作一個程式,它將任何隨機整數加起來它的各個值并創建一個總和。如果轉換為字串形式的和的長度大于 1,我們繼續將整數值相加的程序,直到得到 1 位的和。
我對代碼的問題是,我對值為 1 位的亂數的預期輸出已經將立即回傳該數字,如果數字大于 1 的數字加起來另一個大于 1 位的數字,它將不會重復回圈而是陷入無限回圈。
let digitalRoot = (n) => {
let stringNum = n.toString();
let refArr = [];
let result = 0;
let iterator = refArr.values();
while (stringNum.length > 1) {
for (let i = 0; i < stringNum.length; i ) {
let stringVal = stringNum[i];
stringVal = parseInt(stringVal);
refArr.push(stringVal)
}
for (let number of iterator) {
if (result !== number) {
result = result number;
}
else {
result = result number;
}
}
result = result.toString();
if (result.length === 1) {
result = parseInt(result);
return result;
}
refArr = [];
stringNum = result.toString();
}
if (stringNum.length === 1) {
stringNum = parseInt(stringNum);
return stringNum;
}
}
例如的預期輸出1455應該是6,因為1 4 5 5= 15; 1 5= 6
更新
I know my original code in the question was inefficient but I was able to get my intended result by editing a few things, first was moving the refArr & iterator variables into the while loop, resetting the result to 0 and a few other modifications. Obviously my code is the very very inefficient solution and isn't recommended but I wanted to correct my code as an exercise, etc.
let digitalRoot = (n) => {
let stringNum = n.toString();
let result = 0;
while (stringNum.length > 1) {
let refArr = [];
let iterator = refArr.values();
for (let i = 0; i < stringNum.length; i ) {
let stringVal = stringNum[i];
stringVal = parseInt(stringVal);
refArr.push(stringVal)
}
for (let number of iterator) {
if (result !== number) {
result = result number;
}
else {
result = result number;
}
}
let tester = result.toString();
if (tester.length === 1) {
tester = parseInt(tester);
return tester;
}
stringNum = result.toString();
result = 0;
refArr = [];
}
if (stringNum.length === 1) {
stringNum = parseInt(stringNum);
return stringNum;
}
}
uj5u.com熱心網友回復:
你可以這樣做...
const digitalRoot = n =>
{
while (n > 10)
n = [...n.toString(10)].reduce((s,v)=>s v,0)
return n
}
console.log( digitalRoot( 1455 ))
一些點...
.toString()
n.toString(10) 更改12546為'12546'
擴展語法 (...)
...'123456' 更改'12546'為'1','2','3','4','5','6'(iterationnal)
所以
[...'123456']創建一個陣列 =[ '1','2','3','4','5','6' ]
Array.reduce()
和
v 一元加號 ( )就在字串之前是 : 如檔案中所寫:
一元加號運算子 ( ) 在其運算元之前并計算其運算元,但嘗試將其轉換為數字。
解釋這里使用的 reduce 方法:
[ '1','2','3','4','5','6' ].reduce((s,v) => s v , 0)
做:
step 0 s = 0, v = '1' -> 0 '1' = 0 1 = 1
step 1 s = 1, v = '2' -> 1 '2' = 1 2 = 3
step 2 s = 3, v = '3' -> 3 '3' = 3 3 = 6
step 3 s = 6, v = '4' -> 3 '4' = 6 4 = 10
step 4 s = 10, v = '5' -> 10 '5' = 10 5 = 15
step 5 return 15
uj5u.com熱心網友回復:
如果 n 為負數會怎樣?讓我們為此假設 n >= 0。真的不清楚為什么你有 2 個回圈,而第 2 個回圈對某些東西進行了測驗,但無論如何都會做同樣的事情。
- 一般來說,盡量避免使相同的變數有時是數字,有時是字串。
"15" 1 = "151"盡管15 1 = 16 - 在回圈開始時重置您的累加器。
- 很少需要在回圈之前獲取迭代器
簡化版:
let digitalRoot = (n) => {
while (n >= 10) {
// convert to decimal
let stringNum = n.toString();
let result = 0
for (let i = 0; i < stringNum.length; i ) {
result = parseInt(stringNum[i]);
}
n = result
}
return n
}
uj5u.com熱心網友回復:
更簡單的方法是使用reduce(),這個更高的函式迭代一個值陣列,并在每次迭代時減少這些值的數量,同時用陣列中的下一個值計算累積的前一個值。
將字串拆分為一個陣列,然后將其映射回一個 Number 并 reduce 將累加器添加到每次迭代的回傳值。
const num = 1455;
const num2 = 35714;
const num3 = 11211;
const sumUp = (num) => {
return String(num).split('').map(Number).reduce((a, c) => a c);
}
console.log(sumUp(num), sumUp(num2), sumUp(num3))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/424721.html
標籤:javascript for-loop while-loop
