【问题标题】:Using a counter within a function Scheme在函数 Scheme 中使用计数器
【发布时间】:2021-03-01 00:57:54
【问题描述】:

我想找到一种在函数中使用计数器的方法,其中计数器也是递归函数中的变量。这方面的一个例子是一个程序,它获取一个列表,然后“筛选”它,直到找到其中所有是 i 的倍数的数字:

(define (multiples-of lst) (lambda (i) (if (> i 3))
                               '()
                               (multiplefilter (ismultipleof (+ i 1)) (lst)))))

ismultipleof 检查每个列表的 car 是否是 i + 1 的倍数(i 从 1 开始),然后 multiplefilter 是一个单独的函数,它会删除列表中任何不是的倍数的值i。因此,如果我将(1 2 3 4 5 6 7 8 9 10 11 12) 放入列表中,输出将只是(6 12)。最大的问题是让所说的计数器在函数内工作。

【问题讨论】:

  • 我尝试过使用 (cond 来代替 if 语句,但我仍然遇到同样的问题,它不起作用。
  • 看起来你定义函数的方式有点混乱。您能否举例说明您希望如何调用此过程?
  • 你能补充一点吗?该问题引用了三个函数:multiplesofmultiplefiltermultipleof(没有“s”)。这是一个错字还是你想要的?
  • 另外,据我了解,multipleof 是一个谓词,在您的示例中会为 4 的倍数返回 #t,即 '(4 8 12)。如果这是真的,那么您的示例似乎应该只返回'(12)。再说一遍,这是你的意图吗?
  • 名称有点乱,但这就是目的。我想让数字工作的方式是一个循环(所以检查列表是否是 1、2 和 3 的倍数。我将调整代码以使其更易于阅读。我会通过不同的方式调用它函数或本身,现在我只是在它的循环方面遇到了麻烦。

标签: scheme racket counter higher-order-functions


【解决方案1】:

嗯,这是一个在执行过程中使用计数器的简单函数。 range 只返回一个从 0 到 (- n 1) 的整数列表。编写使计数器递增的东西同样容易。

(define (range n)
  (let loop ((acc '())
             (list-start (- n 1)))
    (if (negative? list-start)
        acc
        (loop (cons list-start acc) (- list-start 1)))))

这个函数倒计时而不是倒计时,因为递归通常会“向后”构建列表。当递归完成时,倒计时只是避免在acc 上调用reverse

迭代通常通过 Scheme 中的递归来完成,而不是像某些语言中的 for 循环。特别是,从尾部递归是值得争取的,因为它不会“爆栈”。

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多