Не совсем понимаю эту проблему с leetcode - PullRequest
1 голос
/ 21 июня 2020

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

# @param {Integer[]} nums
# @return {Integer[]}
def running_sum(nums)
    i = 0
    while i < nums.length - 1
        nums[i+1] = nums[i] + nums[i+1]
        i += 1
    end
    nums
end

Цель этого состоит в том, чтобы собрать «текущая сумма». Я понимаю лог c, но этот синтаксис меня сбивает. Вот что я понимаю:

"Этот метод называется running_sum и имеет массив с именем nums (который предположительно содержит числа). Мы начнем считать эти числа с нуля. Хотя то, что мы считаем, меньше, чем общее количество чисел в нашем массиве минус один, мы будем l oop через нашу начальную точку и одно место в массиве, которое следует. Мы также добавим это следующее число к нашей переносимой сумме, пока мы l oop через него. Наш последний total совпадает с местоположением, которое мы закончили после цикла по массиву. Покажите мне окончательный результат. Мы закончили здесь "

Я думаю, что получил общее logi c, но для репликации Я хотел бы знать, почему здесь используется буква i. Насколько я понимаю, это похоже на переменную, которую мы использовали бы в алгебре. Верно ли мое понимание? Или я совсем не в этом разбираюсь?

Ответы [ 3 ]

1 голос
/ 21 июня 2020
# @param {Integer[]} nums
# @return {Integer[]}
def running_sum(nums) 
    i = 0
    while i < nums.length - 1
        nums[i+1] = nums[i] + nums[i+1]
        i += 1
    end
    nums
end

Метод с именем running_sums является методом экземпляра, который принимает параметр с именем nums. Содержимое переменной nums может быть абсолютно любым, поэтому вам нужно позаботиться об этом, например, что произойдет, если some_object.running_sums будет вызван с использованием следующего параметра %w{word1, word2, word3}

some_object = SomeClass.new
some_object.running_sums(%w{word1, word2, word3})

Кстати, это будет лучше, если running_sums был методом класса, а не методом экземпляра

def self.running_sum(nums) 
  #etc ...
end

Чтобы вы могли делать

SomeClass.running_sums

Вам нужно помнить, что Ruby - это НЕ строго типизирован.

Большинство других языков строго типизированы, Java, C, C ++, C#, PASCAL, COBOL, Delphi, VisualBasi c и многие другие. вам необходимо определить имя переменной до того, как она будет использоваться, и установить тип переменной, например, целое число, строку или десятичное число, тогда эта переменная зарезервирует слот памяти, который может принимать значения только того типа, который вы установили. В строго типизированных языках вы можете указать имя переменной и называть ее как хотите, но определить ее как целое число, и она будет принимать только целые числа. например, var MyWord: integer будет означать, что вы можете назначать только целые числа. В некоторых языках только положительные целые числа, отрицательные целые числа будут иметь другой тип. Будет компилятор, который не будет генерировать exe или какой-либо другой конечный результат и выдает ошибку, если вы попытаетесь присвоить значение неправильного типа, это не так в Ruby.

In Ruby вы можете просто составить слово и вставить в него значение любого типа в любое время, и только потому, что вы даете переменной имя, например my_number, это не помешает кому-то вставлять в нее слова или буквы, например my_number = «Кот сидел на стене», что совершенно верно и явно не является числом.

Так что да, это немного похоже на алгебру, буква i обычно обозначает целочисленный тип, но будьте осторожны в Ruby cos это может быть что угодно, это просто блок памяти, содержащий нули и единицы.

Вышесказанное не совсем верно, но должно дать вам правильное представление.

1 голос
/ 21 июня 2020

Я хотел бы знать, почему здесь используется буква i.

Это ленивая и старая привычка.

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

Но вы можете добиться большего в своем собственном коде.

Их всего два сложные вещи в компьютерных науках: недействительность кеша и именование вещей.

- Фил Карлтон

В упражнении по абстрактному кодированию трудно правильно назвать вещи без реального прикладного контекста. Поэтому автор использовал в качестве имени «Целое число» и сократил его. Но когда вы применяете это в реальном мире, у вас будет вариант использования, который может и должен вдохновлять вас на именование вещей, выходящих за рамки «типа» переменной.

Это не ruby специфично c, но сообщество ruby (я считаю) больше, чем другие сообщества, отдает предпочтение очень длинным и описательным именам методов и переменных. Итак, используйте длинные описательные имена переменных, когда вы применяете полученные знания в своем производственном коде.

1 голос
/ 21 июня 2020

Я хотел бы знать, почему здесь используется буква i.

i - обычно стандартное имя переменной «счетчик» в императивном программировании, сокращение от «index» '(например, массив с индексом i равен nums[i])

...