方案功能作为参数

时间:2019-02-28 03:48:27

标签: scheme

该程序应该使用

(define (sum f n)
  (if (= n 0)
      (f 1)
      (+ (f n) (sum f (- n 1)))))
(define (harm-term k)
  (/ 1 k))
(define (harm-sum n)
  (sum (harm-term 1) n))

创建一个名为harm-sum的函数,该函数计算谐波序列的总和。但我不断收到错误 应用程序:

    not a procedure;
     expected a procedure that can be applied to arguments

  given: 3
  arguments...:

求和函数。

1 个答案:

答案 0 :(得分:2)

(define (sum f n)
  (if (= n 0)
      (f 1)
      (+ (f n) (sum f (- n 1)))))
(define (harm-term k)
  (/ 1 k))
(define (harm-sum n)
  (sum (harm-term 1) n))

您最终调用sum的方式是错误的,因为您使用(harm-term 1)作为期望函数的参数来调用sum。 (harm-term 1)的计算结果显然为1。

这意味着当以后将其用作参数f时,这毫无意义(即您最终调用(1 1)

您应该这样做:

(define (sum f n)
  (if (= n 0)
      (f 1)
      (+ (f n) (sum f (- n 1)))))
(define (harm-term k)
  (/ 1 k))
(define (harm-sum n)
  (sum harm-term n)) ; the difference is the function itself is passed instead of the value the function returns for 1