我無法弄清楚如何創建一個函式,該函式可以將一系列相同的函式作為引數,并將最后一個引數作為運算元。例如:
(func sqrt sqrt sqrt 390625)
上面的呼叫應該回傳 5 作為 (sqrt 390625) > (sqrt 625) > (sqrt 25) > 5
我無法弄清楚我應該寫的確切方式,因為我嘗試過的任何方式都給了我錯誤或實作了無限回圈。
這是迄今為止的代碼:
(define func
(lambda L
(cond ( (equal? (length L) 2) ((car L) (cadr L)) ) ;; If the list consists of only 2 elements, carry out the function (element 1) onto the operand (element 2)
( #t (apply (car L) (func (cdr L))) ) ;; otherwise, apply the function (1st element) onto the rest of the list
)
)
)
第一個條件有效,例如,如果我呼叫(func sqrt 25),則回傳 5 ,但是遞回呼叫會引發錯誤。
我將不勝感激。
uj5u.com熱心網友回復:
OP 沒有提供 的定義chain,所以這部分不清楚,但我認為這里的一個基本問題是沒有遞回呼叫func; 此外,apply沒有在正確的位置使用。
與其(equal (length L) 2)用作基本情況,不如進行遞回呼叫,只要輸入中的第一個元素是程序,否則只回傳元素:
#lang racket
(define multi-call
(lambda args
(let ((arg (car args)))
(if (procedure? arg)
(arg (apply multi-call (cdr args)))
arg))))
這里,whenarg是一個程序,然后它被應用于對multi-call剩余引數遞回呼叫的結果。請注意,它multi-call接受任意數量的引數,將它們包裝在 list 中args。縮減步驟提供(cdr args),它是剩余引數的串列。這意味著apply應該用于呼叫multi-call那些剩余的引數,因為multi-call需要任意數量的引數,而不是引數串列。
multi-call.rkt> (multi-call sqrt sqrt sqrt 390625)
5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/375102.html
下一篇:Prolog中的指令和遞回順序
