【问题标题】:DrRacket procedure body help (boolean-odd? x)DrRacket 程序主体帮助 (boolean-odd?x)
【发布时间】:2013-10-17 09:23:58
【问题描述】:

odd 的迭代版本?对于非负整数参数,可以使用 and、or 和 not 编写。为此,您必须利用 and 和 or 是按从左到右的顺序评估其参数的特殊形式这一事实,一旦确定值就退出。编写 (boolean-odd? x) 时不使用 if 或 cond,而是使用 and, or, not (boolean)。您可以使用 + 和 -,但不要使用商、余数、/ 等。

【问题讨论】:

  • 我只看到这里的说明。有问题吗?如果您编写过代码,请注意:“有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括重现问题的有效代码。”如果您还没有,请注意“要求代码的问题必须表明对正在解决的问题的最低限度的理解。包括尝试的解决方案、它们为什么不起作用以及预期的结果。”到目前为止你做了什么?有什么不好的地方?
  • (define (boolean-odd? x) your_code_here) 那是我们应该写代码的地方。我写的和我纸上写的完全一样。不使用 if 或 cond 编写它的主体,而是使用 and, or, not (boolean) 代替。您可以使用 + 和 -,但不要使用商、余数、/ 等。
  • 我不知道我还能做什么。这只是一个家庭作业,我不知道如何处理它
  • 好吧,如果它是家庭作业,它大概是为了某种类。到目前为止,该课程涵盖了哪些内容?
  • 我们学习了递归和迭代函数。比如阶乘、乘法。今天我们开始了 cons,car,cdr。我们做了配对和配对列表。以最奇怪的方式将对放入列表等......

标签: scheme racket


【解决方案1】:

一个数是偶数,如果被二整除,如果有余数,则为奇数。通常,当您将一个数字 k 除以一个数字 n 时,余数是集合 {0,1,…n-1} 的一个元素。您可以通过询问,当 k 除以 n 时,余数是否在某些特权余值集中,您可以概括您的问题。由于这几乎可以肯定是家庭作业,因此我不想直接回答您的问题,但我会回答这个更通用的版本,而不会拘泥于仅使用 andor 的限制。

(define (special-remainder? k n special-remainders)
  (if (< k n)
      (member k special-remainders)
      (special-remainder? (- k n) special-remainders)))

这个special-remainder? 递归地将k 除以n,直到找到小于n 的余数。然后测试n 的特殊性。在您正在考虑的情况下,您将能够消除special-remainders,因为您不需要(member k special-remainders)。由于您只有一个特殊余数,您只需检查k 那个特殊余数。

【讨论】:

  • @DenizAydemir 请确保仅在它对您真正有用时才接受此答案。我理解为什么(基于 cmets)您可能不接受其他答案,但您也可以选择不接受任何答案。只有当这确实帮助您理解如何解决这个问题时,才接受它。
【解决方案2】:

正奇数可以定义为 1 + 2n。因此奇数是:

  • 如果 x 是 1
  • 如果 x 大于 1,and x-2 为奇数。

因此,尾递归/迭代的*解决方案如下所示:

(define (odd? x)
  (or (= ...)          ; #t if 1
      (and ...         ; #f if less than 1
           (odd? ...))); recurse with 2 less

*玩过它有很多方法可以做到这一点,并且仍然可以迭代并且没有 if/cond。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多