Racket 为什么我会得到一个;“算术不匹配”;错误?SICP练习1.43

Racket 为什么我会得到一个;“算术不匹配”;错误?SICP练习1.43,racket,sicp,Racket,Sicp,我在从一开始工作 练习1.43。如果f是一个数值函数,n是一个正整数,那么我们可以形成f的第n个重复应用,它被定义为x处的值为f(f(…(f(x))…)的函数。例如,如果f是函数x↦ x+1,那么f的第n次重复应用就是函数x↦ x+n。如果f是一个数的平方运算,那么f的第n次重复应用就是将其参数提升到第2次方的函数。编写一个过程,将计算f和正整数n的过程作为输入,并返回计算f的第n次重复应用的过程。您的程序应能按如下方式使用: ((repeated square 2) 5) 625 提示:您可

我在从一开始工作

练习1.43。如果f是一个数值函数,n是一个正整数,那么我们可以形成f的第n个重复应用,它被定义为x处的值为f(f(…(f(x))…)的函数。例如,如果f是函数x↦ x+1,那么f的第n次重复应用就是函数x↦ x+n。如果f是一个数的平方运算,那么f的第n次重复应用就是将其参数提升到第2次方的函数。编写一个过程,将计算f和正整数n的过程作为输入,并返回计算f的第n次重复应用的过程。您的程序应能按如下方式使用:

((repeated square 2) 5)
625
提示:您可能会发现从中使用
compose
很方便

我这样写代码:

(define (repeated f n)
    (lambda (x)
      (if (= n 1)
        (f x)
        (f ((repeated f (- n 1)))))))
错误:

> ((repeated square 2) 5)
...p/1.3.4-mine.rkt:22:2: arity mismatch;
the expected number of arguments does not match the given number
 expected: 1
 given: 0
为什么我的代码不起作用?正确答案是:

(define (repeated f n)
   (if (= n 1)
       f
       (lambda (x)
          (f ((repeated f (- n 1)) x)))))

首先看看你怎么称呼它:

((repeated square 2) 5)
下面我们来看看如何进行递归:

((repeated f (- n 1)))
repeated
返回一个接受一个参数的过程,因此调用不带参数的结果时应发出算术错误信号

在正确答案中,它在递归调用中传递一个必需的参数。但在现实生活中,您不会每一步都重新创建该过程,但可能会使用一个名为
的let

(define (repeated f n)
   (if (= n 1)
       f
       (lambda (x)
         (let loop ((acc x) (n n))
           (if (zero? n)
               acc
               (loop (f acc) (- n 1)))))))