簡體   English   中英

高階函數

[英]Higher-order functions

給定

(define (reduce f id lis)
    (if (null? lis) id
      (f (car lis) (reduce f id (cdr lis)))))

列表的長度可以用reduce來定義(與從頭開始使用遞歸定義相反):

(define (mylength lis) (reduce  (lambda (x n) (+ 1 n)) 0 lis)).

定義列表函數mymap (類似於map ),該列表函數使用一元函數uf lis來表示化lis ,即通過確定in中對應的fid

(mymap uf lis) = (reduce f id lis),

回想一下mymap返回一個列表,該列表是通過在輸入列表中的每個元素上調用函數而得到的,例如(mymap (lambda(x) (* 2 x)) '(1 2 3)) = (2 4 6)

對如何完成此操作進行一些解釋將是有幫助的,而不是公然的答案。 謝謝。

我們有

(mymap uf lis) = (reduce f id lis) = 
 = (if (null? lis) id
     (f (car lis) (reduce f id (cdr lis))))

必須等於

 = (if null? lis) '()
     (cons (uf (car lis)) (mymap uf (cdr lis))))

匹配相應的實體,我們得到

id == '()

並且,由於(mymap uf lis) = (reduce f id lis) ,所以它也是(mymap uf (cdr lis)) = (reduce f id (cdr lis)) ,所以我們有

(f x y) = (cons (uf x) y)

因此,我們定義

(define (mymap uf xs)   ; multiple `x`-es :)
  (reduce (lambda (x r)
             (cons .... r))
          '()
          xs ))

你的reduce是一個正確的選擇 :它的合並函數接收參數列表xs的元素x ,以及處理列表的其余部分的遞歸結果,如r

r具有xs其余部分的所有元素,這些元素已通過uf映射。 所有剩下要做給定元素結合x這個遞歸結果rcons(uf x)r

現在,通過寫實際代碼代替點....來完成定義,應該沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM