Добавление значения y к лямбда x рекурсивно со схемой - PullRequest
0 голосов
/ 12 сентября 2018

Я пробовал разные комбинации, но, похоже, не могу найти правильную.Что я пытаюсь сделать, это добавить переменную y к каждому элементу в списке x и распечатать список с результатом (y + x_1 + y + x_2 ... y + x_n).

Вот моя схемакод:

(define (incall y) 
  (lambda (x)
    (if (null? (cdr x))
       x ;;Tried several variations
    (+ y x) ;;Same here (using car/cdr /cons)
    )
  )
)

Я использую числа:

    ((incall 2) '(1 2 3)) 

и должен давать.

    (2 3 4)

Любая помощь приветствуется и объяснение того, что я делал неправильно.

1 Ответ

0 голосов
/ 12 сентября 2018

Вам нужно назвать свою процедуру карри, чтобы вы могли использовать ее для остальной части списка из самого себя:

(define (add-list intial-value) 
  (define (curried-proc lst)
     ...)
  curried-proc) ; return the proc

Я не знаю, зачем вам этот интерфейс.Я бы предпочел сделать (add-list 2 '(1 2 3)) ; ==> (3 4 5), тогда вы бы сделали это:

(define (add-list initial-value lst) 
  (define (helper lst)
     ...)
  (helper lst)) ; return the result of calling helper

То есть помощнику. Вам нужно обработать только первый элемент и выполнить рекурсивный анализ для остальных, если не ноль.Для нуля это должно быть нулем.например.

(define (helper lst)
  (if (null? lst) 
      <??>                        ; what is the result of (incall 5 '())
      (cons <calculate>           ; what whould (car x) be replaced with?
            (helper (cdr lst)))))

Теперь помощник можно заменить на имя let.Это то же самое.Вот рабочая версия чего-то похожего на то, что вы делаете:

(define (halve-list lst)
  (let helper ((lst lst))
    (if (null? lst)
        '()
        (cons (/ (car lst) 2)
              (helper (cdr lst))))))

(halve-list '(1 2 3 4)) ; ==> (1/2 1 3/2 2)

Другой способ сделать это с помощью map, поскольку он заботится о большей части помощника, за исключением того, что делать с каждым элементом:

(define (halve-list lst)
  (map (lambda (e) (/ e 2)) lst))
...