2015-09-24 84 views
0

這是我寫的解決問題的程序。檢查是否存在等於數組中最大數的元素總和,如果是,則返回true,否則返回false。遞歸返回語句

var found = "false"; 
var max; 

function ArrayAdditionI(array) { 

max = Math.max.apply(null,array); 
var p = array.indexOf(max); 

array.splice(p,1); 
array.sort(function(a, b){return a-b;}); 


found = findSum(array, 0, 0); 

return found; 

} 

function findSum(array, sum, startIndex){ 

for(var i = startIndex; i < array.length ; i++){ 

    sum += array[i]; 

    if(sum === max){ 
     found = "true"; 
     break; 
    }else if(sum > max){ 
     break; 
    } 

    if(i+2 < array.length && sum < max){ 
     findSum(array, sum, i+2); 
    } 

} 
    if(startIndex < array.length && sum !== max){ 
     return findSum(array, 0, startIndex+1); 
    } 

    return found; 
} 

ArrayAdditionI(readline()); 

我不得不使用全局變量,找到,指示已找到總和的位置。 return語句總是返回undefined。

此外,如果我在下面的if語句中使用return語句,代碼無法正常工作。

if(i+2 < array.length && sum < max){ 
    return findSum(array, sum, i+2); 
} 

這不是問題的最佳解決方案,但這是我工作的版本。

我的問題是爲什麼我得到未定義,如果我在if語句中使用return語句。此外,我試圖不使用全局和使用返回真如果sum === max,並在最後返回false,它總是返回false或undefined。

- 更新2:代碼,錯誤的結果 -

function ArrayAdditionI(array) { 
    var max = Math.max.apply(null,array); 

    //remove max element from array 
    var p = array.indexOf(max); 
    array.splice(p,1); 

    //sort array 
    array.sort(function(a, b){return a-b;}); 

    //call find sum function 
    return findSum(array, 0, 0, max); 

} 

function findSum(array, sum, startIndex){ 
    for(var i = startIndex; i < array.length ; i++){ 

     sum += array[i]; 

     if(sum === max){ 
      return true; 
     }else if(sum > max){ 
      break; 
     } 

     if(i+2 < array.length && sum < max){ 
      **return** findSum(array, sum, i+2, max); 
     } 

    } 
    if(startIndex < array.length && sum !== max){ 
     return findSum(array, 0, startIndex+1, max); 
    } 

    return false; 
} 

// calling the first function 
ArrayAdditionI([ 7, 2,90, 31, 50 ]);   

程序的啓動是這樣的呼叫:ArrayAdditionI([7,2,90,31,50]); 回報應該是真實的。 另外,ArrayAdditionI([1,2,3,4]);是真的。 但是,ArrayAdditionI([1,2,3,100]);是錯誤的。

** **之間的返回語句,當刪除代碼工作時,否則我得到假或未定義。我不明白這部分!爲什麼取消返回可以解決問題,我認爲每個遞歸調用都必須用return語句繼續。

問題可能是由於多次調用?我是否以不正確的方式使用遞歸?

+3

這是什麼問題?如何不使用全球?如何更好地解決問題? –

+3

注意事項:不要使用字符串布爾值。使用布爾值作爲布爾值。 :-)例如,'found = false'(不是'found =「false」''),'found = true'(不是'found =「true」'),'if(found)'(不是'if(found = =「true」)')... –

+0

我的問題是如果我在if語句中使用return語句,爲什麼會得到undefined?此外,我試圖不使用全局和使用返回真如果sum === max,並在最後返回false,它總是返回false或undefined。 – Maryam

回答

0

下面的函數應該給你一個真或假的答案,關於數組內的任何值的組合是否產生最大值。

var a = [ 
     1, 1, 1, 1, 1, 1, 
     1, 1, 1, 9 
    ] 
    var b = [1,1,1,5] 
    function MembersHoldMaxSum(arr) { 
     var i, r = false, index, max = Math.max.apply(null, arr), index; 
     for (i = 0; i <= arr.length - 1; i++) { 
      for (index = 0; index <= arr.length - 1; index++) { 
       var new_arr = [], ct; 
       for (ct = 0; ct <= arr.length - 1; ct++) { 
        if (index != ct) { new_arr.push(arr[ct]) } 
       } 
       while (new_arr.length != 1) { 
        var sum = 0, ct2 = 0; 
        for (ct2 = 0; ct2 <= new_arr.length - 1; ct2++) { 
         sum += new_arr[ct2]; 
        } 
        if (sum == max) { return true } 
        new_arr.pop() 
       } 
      } 
     } 
     return r 
    } 
    var returns_true = MembersHoldMaxSum(a); 
    var returns_false = MembersHoldMaxSum(b); 
+0

這是什麼運氣? –

+0

@Maryam請不要忘記這個問題。我爲自己創造了一個工作示例花費了相當多的時間。當你有時間時,請點擊問題上的綠色複選標記以接受答案。這給你和我額外的聲望點。提前致謝。 –

0

您的代碼有一些錯誤可能會導致錯誤。

T.J. Crowder已經說過,使用實際的布爾值而不是字符串。

found變量未在findSum函數中定義。這讓JavaScript假設你正在設置一個全局變量。 將var found = false;添加爲findSum函數的第一行。

內最後if內,您的for有到findSum函數的調用,但它沒有返回它的價值,也將其分配到found變量。

修復這些問題並更新您的問題的結果。

+0

找到是一個全局變量。如果我使用return語句,我會得到未定義的。上面的代碼正在工作。我只是想知道爲什麼遞歸和返回聲明不起作用。我不得不添加全局變量作爲解決方法。 – Maryam

+0

對不起,我放棄了試着瞭解你的代碼是如何工作的以及你想要什麼。你有時會分配'found' var,有時候你會返回值。 – gfpacheco

+0

它被定義在最上面。 var found = false。有兩個函數,數組加法,首先調用,並將數組作爲輸入*參見最後一行*,第二個函數find sum檢查是否存在總和。 – Maryam