为什么我的列表反向函数只能自己工作,而不是另一个函数内部工作?

时间:2019-04-07 18:05:04

标签: functional-programming scheme racket procedural-programming

我试图在另一个函数中调用我编写的反向函数(该函数在单独调用时有效),但是输出错误的结果。

我正在编写一个程序,以获取相对于x的二元多项式的导数。我有一个名为 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个功能正常工作,直到在 poly_derx 中添加 reverse_list 。另外,我知道有一个反向内置函数,但我面临相同的问题。

这时,我唯一要做的就是尝试在函数的不同点调用反向,但是我对工作一无所知。

1 个答案:

答案 0 :(得分:4)

您的问题取决于您在默认情况下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 '()))

因此请注意,您不能为每个迭代应用一次要执行的过程。它将产生意想不到的结果。