Почему моя функция обратного просмотра списка работает сама по себе, а не внутри другой функции? - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь вызвать обратную функцию, которую я написал (которая работает, когда вызывается одна) внутри другой функции, но она выдает неверные результаты.

Я пишу программу для получения производной по отношению кх, двумерного многочлена.У меня есть основная функция с именем poly_derx , которая будет вызывать две мои вспомогательные функции reverse_list и mult_by_index .

(define (mult_by_index list_1)
  (if (null? list_1)
      list_1
      (map * list_1 (range (length list_1)))))

(define (reverse_list list_1)
  (if (null? list_1)
      list_1
      (append(reverse (cdr list_1)) (list (car list_1)))))

(define (poly_derx list_1)
  (if (null? list_1)
      list_1
      (reverse_list(cons (mult_by_index (car list_1)) (poly_derx (cdr list_1))))))

(poly_derx `( (1) (1 2 3) () (3)))

Опять мои 3 функцииработать нормально, пока я не добавлю reverse_list в poly_derx .Кроме того, я знаю, что есть встроенный реверс, но я сталкиваюсь с той же проблемой.

На данный момент, единственное, что мне известно, это попытаться вызвать реверс в разных точках функции, но ничего не знаю о работах..

1 Ответ

4 голосов
/ 07 апреля 2019

Ваша проблема заключается в том, что вы reverse в случае по умолчанию, и он вызывается для каждого подсписка от конца к началу. Таким образом, (poly_derx '(1 2 3)) становится (reverse_list (cons res1 (reverse_list (cons res2 (reverse_list res3 (reverse_list '()))))). Вам нужно только полностью изменить окончательный результат. Вы можете сделать это с помощью помощника:

(define (poly_derx list_1)
  (define (helper list_1)
    (if (null? list_1)
        list_1
        (cons (mult_by_index (car list_1)) (helper (cdr list_1)))))

  (reverse_list (helper list_1)))

Кроме того, поскольку списки создаются от начала до конца и повторяются от начала до конца, вы можете использовать это для обращения к спискам в помощнике.

(define (poly_derx list_1)
  (define (helper list_1 result)
    (if (null? list_1)
        result
        (helper (cdr list_1) (cons (mult_by_index (car list_1)) result))))

  (helper list_1 '()))

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

...