如何在Scheme中编写函数的函数

如何在Scheme中编写函数的函数,scheme,racket,Scheme,Racket,我应该写一个名为(n次过滤Fn)的函数,其中f是一个变量的函数,n是一个自然数,其计算结果是第n个自然数,因此应用于该数字的f是#t 如果我们打电话 (n次过滤偶数?1)我们将得到2 (第n个过滤素数?10)我们将得到29个 如何使其适用于任何顺序函数?在处理此类问题时,我应该考虑什么?变量是一个变量,+也是一个变量。函数和其他数据类型之间的主要区别在于,可以将函数名用参数括在括号中,它将成为一个新值 例如 现在合同上没有这么说,你通过看你做了(fun…,fun需要是一个函数来扣减。想象一下:

我应该写一个名为
(n次过滤Fn)
的函数,其中
f
是一个变量的函数,n是一个自然数,其计算结果是第n个自然数,因此应用于该数字的
f
#t

如果我们打电话
(n次过滤偶数?1)
我们将得到2

(第n个过滤素数?10)
我们将得到29个


如何使其适用于任何顺序函数?在处理此类问题时,我应该考虑什么?

变量是一个变量,
+
也是一个变量。函数和其他数据类型之间的主要区别在于,可以将函数名用参数括在括号中,它将成为一个新值

例如

现在合同上没有这么说,你通过看你做了
(fun…
fun
需要是一个函数来扣减。想象一下:

(define test (double 5)) ; probably works OK
(test 1) 
最后一个失败,因为您得到了
应用程序:5不是一个过程
或类似的东西。错误消息未标准化


如何攻击您的任务是通过使一个助手具有与您的函数相同的参数,但另外我猜当前的数字从1开始。正如我所演示的,当调用
f
时,您将函数变量用作函数,并通过始终增加数值和减少
n
来递归。实际函数将只通过传递状态变量之外的所有参数来使用helper

您的问题需要折叠,这是一种标准的方法,可以迭代列表中的其他内容,同时记录到目前为止所做的事情

这是一个非常棘手的方法,使用:

for/fold
获取初始状态列表。这里我们将
count
定义为给定谓词返回
#t
的次数,将
current
定义为当前测试值

然后它需要一个迭代器列表,在本例中,我们只在
(在自然语言中)
上进行无限次迭代

为了使其停止,我们提供了一个
#:break
条件,即“当truthy谓词的数量(
count
)等于请求的数量(
index
)时”

for/fold
请求它的主体以每个“状态”变量的值列表结束,以便为下一次迭代更新它们。这里我们提供两个值:一个是新的
计数
,另一个只是当前的
n

您可以试用,它可以按照您的要求工作:

> (nth-filtered even? 1)
2
> (require math/number-theory)
> (nth-filtered prime? 10)
29
> (nth-filtered prime? 5)
11

您需要一个助手函数,因为您必须同时跟踪
n
和“当前数字”,或者需要一个可以过滤的惰性序列。您所指的“顺序函数”是什么还不是很清楚。顺序函数是1,2,3,4,5,。。。或2,4,6,8,10。。。或者1,3,5,7,9…我会称之为“序列”,而不是“函数”,但不清楚这与问题有何关联。
(define (nth-filtered predicate index)
  (for/fold ([count 0]
             [current #f] #:result current)
            ([n (in-naturals 1)]) ; we start at 1 but we could start at 0
            #:break (= count index)
    (values (if (predicate n) (add1 count) count)
            n)))
> (nth-filtered even? 1)
2
> (require math/number-theory)
> (nth-filtered prime? 10)
29
> (nth-filtered prime? 5)
11