Выравнивание всех элементов в списке по схеме - PullRequest
0 голосов
/ 16 февраля 2020

Я хотел возвести в квадрат все элементы списка с помощью языка программирования Scheme. мой код:

(define (square n) (* n *n))

(define (fun items factor)
  (if (null? items)
      0
      (cons (* (fun (car items)
                    factor))
            (fun (cdr items)
                 factor) ) ) ) )
(display (fun '( 1 2 3 4) square))

Я показываю эти ошибки:

ERROR: In procedure car: 
  ERROR: In procedure car: 
    Wrong type (expecting pair): 1

Ответы [ 3 ]

1 голос
/ 16 февраля 2020

У вас есть пара ошибок:

  • В процедуре square есть дополнительные *, которых не должно быть
  • Если мы создаем список как выводим, тогда базовый случай должен возвращать пустой список '(), а не 0.
  • Часть, в которой вы работаете с текущим элементом списка, неверна, вы должны просто вызвать процедуру factor в car списка, и нет необходимости снова умножать, square позаботится об этом.

Это должно исправить их:

(define (square n) (* n n))

(define (fun items factor)
  (if (null? items)
      '()
      (cons (factor (car items))
            (fun (cdr items) factor))))

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

(map square '(1 2 3 4))
=> '(1 4 9 16)
0 голосов
/ 22 февраля 2020

Хвост рекурсивной реализации map (чтобы не перезаписывать встроенный map Я назвал его *map).

(define (square x) (* x x))

(define (*map func lst (acc '()))
  "Apply func on each element of the list."
  (cond ((null? lst) (reverse acc))
        (else (*map func (cdr lst) (cons (func (car lst)) acc)))))

Запустить его:

(*map square '(1 2 3)) ;; '(1 4 9)
0 голосов
/ 17 февраля 2020

Вот другой метод:

(define factor-list
  (lambda (l factor return)
    (if (null? l)
        (return '())
        (factor-list (cdr l)
                     factor
                     (lambda (rest)
                       (return (cons (factor (car l))
                                     rest)))))))


(define input '(1 2 3 4))
(factor-list input (lambda (x) (* x x)) (lambda (x) x))

...