2013-10-04 4 views
1

Я попытался найти сумму всех чисел вложенного массива, но я не получу ее для правильной работы. Это то, что я пробовал:Поиск суммы вложенного массива

function arraySum(i) { 
    sum=0; 
    for(a=0;a<i.length;a++){ 
     if(typeof i[a]=="number"){ 
      sum+=i[a]; 
     }else if(i[a] instanceof Array){ 
      sum+=arraySum(i[a]); 
     } 
    } 
    return sum; 
} 

Знает ли кто-нибудь, где в этом есть ошибка? Когда вы попробуете его с массивом [[1,2,3], 4,5], он получает 6 как ответ, а не 15. Я не знаю, почему.

+0

Попробуйте переместить' уаг sum' выше функций – Martijn

+1

Я думаю, объявляющие:.. вар суммы = 0; будет делать трюк для вас Пропал вар ключевого слова – SHANK

ответ

7

Проблема с вашим кодом в том, что переменные и a являются глобальными, а не локальными. Из-за этого вы получаете бесконечный цикл (a от первой записи в функции сбрасывается второй записью, поэтому одни и те же элементы обрабатываются снова).

Фикс, добавив var, где sum и a объявлены, чтобы сделать их локальными по отношению к функции:

function arraySum(i) { 
    var sum=0; // missing var added 
    for(var a=0;a<i.length;a++){ // missing var added 
     if(typeof i[a]=="number"){ 
      sum+=i[a]; 
     }else if(i[a] instanceof Array){ 
      sum+=arraySum(i[a]); 
     } 
    } 
    return sum; 
} 

Демо: http://jsbin.com/eGaFOLA/2/edit

+0

+1, кажется, все заметили недостающую сумму 'var' для суммы, но никто не заметил, что она отсутствует в цикле for. Хорошо сделано на месте и объясняет proble тоже! – musefan

0

Вам не хватает двух var. Вы неявно объявляется sum и a в окно рамки:

function arraySum(i) { 
    **var** sum=0; 
    for(**var** a=0;a<i.length;a++){ 
     if(typeof i[a]=="number"){ 
      sum+=i[a]; 
     }else if(i[a] instanceof Array){ 
      sum+=arraySum(i[a]); 
     } 
    } 
    return sum; 
} 
+1

я думал, что это слишком , но тестирование его по-прежнему приводит к 6 – musefan

+0

Var не делает этого :) – Martijn

0

Recurse, например

function arraySum(x) { 
    var sum = 0, i; 
    if (typeof x === 'number') 
     return x; 
    else if (x instanceof Array) 
     for (i = 0; i < x.length; ++i) 
      sum += arraySum(x[i]); 
    return sum; 
} 
arraySum([[1,2,3],4,5]); // 15 

я не оптимизировал это так, чтобы было понятно, вы можете больше логики перед рекурсии.


Причина твоя не работает, потому что вы должны var как sum и a.

0

Прежде всего, почему вы используете «я» в качестве входных данных функционировать? мы используем «i», чтобы обозначить текущий индекс. Что касается вашего вопроса, вы хотите, чтобы «a» был локальным в вашем цикле, а вместо «for (a = 0; ...» вместо этого пишите «for (var a = 0 ;»

<html> 
    <body> 
     <script> 
      function NestedArraySummation(arr) 
      { 
       var sum=0; 
       for(var i=0;i<arr.length;i++) 
       { 
        if(typeof arr[i]=="number") 
        sum=sum+arr[i]; 
        else if(arr[i] instanceof Array) 
         sum=sum+NestedArraySummation(arr[i]); 
       } 
        return sum; 
      } 

      var MyArray=[1,[2,3],4,10,[1,2]]; 
      var Sum=NestedArraySummation(MyArray); 
      document.write(Sum); 

     </script> 
    </body> 
</html> 
-1
from __builtin__ import int 
def nestedLists(mylist): 
    sum = 0 
    if checkIfAllInt(mylist): 
     result = addList(mylist) 
     return result 
    else: 
     for value in mylist: 
      sum = sum + nestedLists(value) 
    return sum   

def addList(listdata): 
    if(type(listdata) is int): 
     return listdata 
    else: 
     return sum(listdata)  

def checkIfAllInt(listdata): 
    check = True 
    if(type(listdata) is int): 
     return check 
    else: 
     for value in listdata: 
      if(not type(value) is int): 
       check = False 
       return check 
    return check  

print nestedLists([1,[2,3,[4,5,[6,7]]]])  
+0

Правильно отформатированный код всегда легко читать и понимать. Я отформатировал этот ответ для вас. Прочтите [this] (http://stackoverflow.com/editing-help) справочное руководство по форматированию. –

+1

Просьба пояснить, как этот код решает проблему OP. –

+0

Вы ответили неверным языком программирования ... Также «' from __builtin__ import int' »o_O – kay

Смежные вопросы