Racket 为什么我会得到一个;“算术不匹配”;错误?SICP练习1.43
我在从一开始工作 练习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次重复应用的过程。您的程序应能按如下方式使用: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 提示:您可
((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)))))))