2015-04-23 83 views
2

我想通過做一些練習來刷新我的JavaScript。返回值沒有傳遞給其他函數

我寫了一個range函數,該函數接受兩個參數start和end,並返回一個數組,其中包含從開始到(包括)結束的所有數字。

然後我寫了一個sum函數,該函數接受一組數字並返回這些數字的總和。

問題是當我從range返回一個值並傳遞給第27行sum(或console.log(sum(range(1, 10)));)。不過,我得到零作爲返回值。我通過傳遞數組test來檢查我的sum函數,它按預期工作。我忽略了什麼?

function range(start, end, step){ 
    if(step === undefined){ step = 1; } 

    var arr = []; 

    for(var i = start; i >= end; i += step){ 
    arr.push(i); 
    } 

    return arr; 
} 

function sum(nums){ 
    var total = 0; 

    for(var i = 0; i < nums.length; i++){ 
    total += nums[i]; 
    } 

    return total; 
} 
var test = [1, 3, 5]; 
console.log(sum(test)); 
// → returns 9 


console.log(range(5, 2, -1)); 
// → returns [5, 4, 3, 2] 

console.log(sum(range(1, 10))); 
// → should return 55, but returns 0 
+1

普羅布茲想'typeof step ==='undefined''。 – Fuser97381

+1

當你做console.log時,你會得到什麼(range(1,10));這比縮小你寫的那個更有幫助。即。如果返回[1,2,3,4,5,6,7,8,9,10],那麼問題就是sum()。否則,問題在範圍()中。 –

+0

'範圍(1,10)'返回0 @DanB。 – Scimonster

回答

1

您的range函數在其for循環條件中存在問題。這是我得到了什麼工作,也負責處理降範圍:

function range(start, end, step){ 
    if(step === undefined){ step = 1; } 

    var c = (Math.max(start, end) - Math.min(end, start))/Math.abs(step); 
    var arr = []; 

    for(var i = start; c-- >= 0; i += step){ 
    arr.push(i); 
    } 

    return arr; 
} 

它增加了一個計數器c的步驟來走量,遞減它,直到它是小於0,不與iend擔心。

這裏有一個小提琴:http://jsfiddle.net/syssqob4/2/

+1

但後來它以失敗的步驟失敗。 – Scimonster

+0

@Scimonster感謝捕獲,更新爲它的帳戶。 – doogle

1

。在你的for循環有問題。

for(var i = start; i >= end; i += step){ 
    arr.push(i); 
} 

這假定step總是負的,那start總是比end更大。

您可以對代碼進行最低限度的更改以使其工作如下。您不需要進行類型檢查(確保步驟是一個數字),但最好不要假設用戶始終遵循您的假設(我沒有對startend進行類型檢查)。例如,你自己並沒有遵循步驟爲負的假設。

if (isNaN(parseFloat(step))) // This makes sure step is a numeric variable 
    return arr; 

if (step == 0) // This makes sure that the for loop won't be an infinite loop 
    return arr; 

if (step > 0) // This makes sure that step is going to be a negative value 
    step = -1 * step; 

if (start < end) { // This makes sure that start is always greater than end 
    var tmp = end; 
    end = start; 
    start = tmp; 
} 

for(var i = start; i >= end; i += step){ 
    arr.push(i); 
} 
0

您正在檢查以確保啓動大於結束。如果你正在增加,情況總是如此。在進入循環之前,你應該確保你有正確的順序。那麼你總是可以從低到高循環。

對於開始和結束,您還有競爭的步驟的概念。步驟只應採取正整數。如果開始時間低於結束時間,則需要下臺。如果你想使它更強大,那麼只需加上:int step = Math.abs(step);

int low; 
int high; 

if(start < end) { 
    low = start; 
    high = end; 
} 
else { 
    low = end; 
    high = start; 
} 

for(var i = low; i >= high; i += step){ 
    arr.push(i); 
} 
相關問題