Сумма элементов в списке Racket

Я работаю с простыми списками в Racket и выполняю функцию для суммирования элементов списка.

Но я хотел бы знать, есть ли более простой способ сделать это.

Я сделал эту функцию:

(define (mySum L)
  (if (empty? L) 0
      (+ (first L) (mySum (rest L))))
  )

вывод:

(mySum '(1 2 3 4))
10

Я хотел знать, знает ли кто-нибудь более простой способ сделать это. Объясню, например: Вот еще одна функция, которую я сделал:

(define (myAppend L1 L2)
  (if (empty? L1) L2
      (cons (car L1) (myAppend (cdr L1) L2)))
  )

Но эту функцию можно сделать проще, выполнив следующее:

(define (myAppend L1 L2)
  (append L1 L2)
  )

Моя проблема заключается в том, чтобы узнать, есть ли более простой способ вычислить сумму элементов в списке. Спасибо


person Jonatan Lavado    schedule 06.01.2017    source источник


Ответы (4)


Если вам нужна только короткая программа,

(define (mySum L)
  (apply + L))

короче. Является ли это «проще» - это вопрос интерпретации: то, как вы написали, кажется «проще» в том смысле, что оно определяется исключительно на основе структуры списков, тогда как (apply + L) полагается как на полумагическую функцию (apply), так и на полупричудливое поведение + (тот факт, что он принимает переменное количество аргументов), который сам должен делать что-то похожее на то, что вы уже написали.

(Между прочим, я бы тоже не назвал ваш myAppend пример проще - первый на самом деле определяет нужную вам функцию, тогда как второй просто ссылается на желаемое поведение. , который, в свою очередь, должен был быть определен в другом месте.Если вы делаете это как часть практической программы, (apply + L) и использование встроенного append, безусловно, лучший способ, но если это в образовательных целях, то я думаю, что начальный версии обеих функций лучше.)

person jacobm    schedule 06.01.2017
comment
Спасибо, что поделились своими знаниями! - person Jonatan Lavado; 06.01.2017

Другой способ приблизиться к этому был бы

(define (my-sum lst)
 (foldr + 0 lst))

Это использует встроенную функцию folderr и довольно короткая. Foldr использует функцию (+), базовый регистр (0) и список (lst). Я приложил ссылку на визуальное представление foldr, а также ссылку, которая очень хорошо это объясняет.

ссылка

Подробнее здесь

person Simar Chawla    schedule 07.01.2017
comment
Некоторое интересное обсуждение сгиба здесь также stackoverflow.com /вопросы/39018163/. - person rnso; 15.01.2017

Можно также использовать for/sum:

(define (my+ L)
  (for/sum ((i L))
    i))

(my+ '(1 2 3 4))  ; => 10

'named let' — версия, похожая на рекурсивные функции, но более понятная:

(define (myplus L)
  (let loop ((L L)
             (s 0))
    (cond
      [(empty? L) s]
      [else (loop (rest L) 
                  (+ s (first L)))] )))

'cond' также можно заменить здесь на 'if', так как здесь всего 2 случая. Ключевое слово else также можно опустить.

person rnso    schedule 07.01.2017

person    schedule
comment
Было бы лучше, если бы вы объяснили, почему и как этот код решает проблему. Форматирование кода также приятно. Это :) часть кода? - person brasofilo; 08.05.2017