2016-11-10 70 views
0

我試圖解決這個問題:程序爲何給我這個消息:「程序停止運行時間過長」

的81號有一個特殊的財產, 總和的一定的權力其數字等於81(9平方)。八十一(81),是具有此屬性的 第一個數字(不考慮一個 數字的數字)。下一個,是512讓我們來看看這兩種情況下與細節

8 + 1 = 9 and 9^2 = 81 

512 = 5 + 1 + 2 = 8 and 8^3 = 512 

我們需要的功能,power_sumDigTerm(),接收數字n,並且可以輸出n-th項數的序列中。我們上面介紹的情況意味着: 所以我已經解決了如下問題;

function findPow(sum,i) { 
    var counter = 0; 
    while (true) { 
    counter++; 
    if (Math.pow(sum,counter) === i) { 
     return true; 
    } else if (Math.pow(sum,counter) > i) { 
     return false; 
    } 
    } 
} 

function powerSumDigTerm(n) { 
    var index = 80; 
    var result = []; 
    function loop() { 
     index++; 
     var sum = 0; 
     var string = index.toString(); 
     for (var i =0;i<string.length;i++) { 
     sum += Number(string[i]); 
     } 
     if (findPow(sum,index)) { 
     result.push(index); 
     } 
     return (n === result.length) ? result[n-1] : loop() 
    } 
    return loop() 
} 

這裏的問題是,當我跑的功能,並通過在1 powerSumDigTerm(1)。預期產量將爲81。但是,如果我們傳入2 console.log(powerSumDigTerm(2)),函數會返回一條消息:Program halted for running too long, sorry!有沒有人有任何解釋爲什麼函數會這樣做?以及如何避免它?

+0

有一個在你的編程logir故障從未走出while循環。您需要修復IF子句。 –

+0

你的意思是在findPow函數中嗎? –

回答

1

該問題在您的findPow函數中。

考慮100的情況。在總和爲1和1的情況下,任何數字的上升將導致1,即i^x == 1。所以,你需要處理一個特殊情況1來解決這個問題。

if (sum <= 1) return false; 

此外,您正在使用遞歸,即將拋出StackOverflow異常。我在解決方案下進行了測試,並且適用於n = 15。隨着複雜性呈指數級增長,計算更高的數字需要一個非常優化的解決方案。

function findPow(sum, i) { 
 
    if (sum <= 1) return; 
 
    var counter = 0; 
 
    while (true) { 
 
     counter++; 
 
     if (Math.pow(sum, counter) === i) { 
 
      return true; 
 
     } else if (Math.pow(sum, counter) > i) { 
 
      return false; 
 
     } 
 
    } 
 
} 
 

 
function powerSumDigTerm(n) { 
 
    var index = 80; 
 
    var result = []; 
 

 
    function next() { 
 
     index++; 
 
     var sum = 0; 
 
     var string = index.toString(); 
 
     for (var i = 0; i < string.length; i++) { 
 
      sum += Number(string[i]); 
 
     } 
 
     if (findPow(sum, index)) { 
 
      result.push(index); 
 
     } 
 
    } 
 
    while (result.length < n) 
 
     next() 
 

 
    return result[n - 1]; 
 
} 
 

 
console.log('1:', powerSumDigTerm(1)); 
 
console.log('2:', powerSumDigTerm(2)); 
 
console.log('5:', powerSumDigTerm(5)); 
 
console.log('10:', powerSumDigTerm(10));

+0

你的解釋很棒,我只是運行你的解決方案,但程序仍然給我這個消息:'進程被終止。花費超過12000毫秒才能完成'。它來自coderwars.com –

0

由於@Adnan指出,有一個在您findPow()功能的問題:如果sum爲1它會進入一個無限循環,你也有一個堆棧溢出的風險錯誤。

當簡單的循環可以做到時,在這裏使用遞歸確實沒有意義。你也應該避免while(true)環,其通常只是懶惰的標誌:

function findPow(sum, i) { 
 
    for (var pow = 0; sum > 1 && Math.pow(sum, pow) <= i; pow += 1) { 
 
    if (Math.pow(sum, pow) === i) { 
 
     return true; 
 
    } 
 
    } 
 
    return false; 
 
} 
 

 
function sumDigits(number) { 
 
    var sum = 0; 
 
    var str = number.toString(); 
 
    for (var i = 0; i < str.length; i++) { 
 
    sum += Number(str[i]); 
 
    } 
 
    return sum; 
 
} 
 

 
function powerSumDigTerm(n) { 
 
    var result = []; 
 

 
    for (var index = 1; result.length < n; index += 1) { 
 
    if (findPow(sumDigits(index), index)) { 
 
     result.push(index); 
 
    } 
 
    } 
 

 
    return result[n - 1]; 
 
} 
 

 
for (var i = 1; i <= 20; i += 1) { 
 
    console.log(i, powerSumDigTerm(i)); 
 
}

+0

你的解釋很棒,我只是運行你的解決方案,但程序仍然給我這個消息:'進程被終止。花費超過12000毫秒才能完成'。它來自coderwars.com –

+0

你最後刪除了'for'循環嗎?這僅僅是爲了演示目的。 – JLRishe

相關問題