tcl найти максимальный элемент списка - PullRequest
0 голосов
/ 18 ноября 2018

я новичок в tcl, я пытаюсь получить элемент max в данном списке, я написал функцию, которая печатает max, но она не работает должным образом, вот код

proc findmax { items } {
  set max 1
  foreach i $items { 
    if { $i > $max } {
      set $max $i
    }
  }
  puts "max is = $max"
}

и явызвал функцию следующим образом:

findmax $items

это список, который я передал:

set items { 12 2 5 4 2 6 7 55 8 9 6 4}

, но он выдает 1, а не 55, как ожидалось

1 Ответ

0 голосов
/ 19 ноября 2018

Ваша проблема в этой строке:

set $max $i

В Tcl символ $ означает чтение из именованной переменной и использование этого значения в качестве (возможно, части) аргументав команду.Это означает, что всегда .Никаких исключений (если, конечно, не указано обратный слеш или { фигурные скобки }).Таким образом, на первой итерации цикла вы получаете (после подстановки):

set 1 12

Имя переменной 1 допустимо, но необычно и не то, что вы хотите.Чтобы алгоритм работал, вы вместо этого хотите дать команде set имя переменной, которую нужно установить, max, в результате чего:

set max $i

, которая будетзаменил это на первой итерации:

set max 12

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


Стандартный метод получения максимального значения списка состоит из одной строки:

set max [tcl::mathfunc::max {*}$items]

При этом используется встроенная функция max (которая находится в пространстве имен ::tcl::mathfunc) и передается содержимое.списка в items как несколько аргументов, все как один шаг.Последовательность {*}$ представляет собой комбинацию правила синтаксиса чтения переменных с правилом раскрытия списка, о котором вы, вероятно, еще не задумывались.Тем не менее, это хорошее упражнение - написать свой собственный искатель максимума в качестве учебного упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...