计算句子中奇数的数量

时间:2012-12-19 04:42:00

标签: recursion lisp scheme sicp

我对lisp相当新,这是一个练习题。

首先,这个问题来自于scheme。我不知道如何回答这个问题 这个问题的目的是编写函数count-odd 将一个句子作为输入并计算其中包含多少个奇数位数,如下所示:

  

(count-odd'(234 556 4 10 97))   6

  

(count-odd'(24680 42 88))   0

如果可能,您将如何使用更高阶函数或递归或两者兼而有之 - 无论何时完成工作。

4 个答案:

答案 0 :(得分:4)

我会给你一些指示,而不是一个完整的解决方案:

首先,我看到了两种不同的方法:递归或高阶函数+递归。对于这种情况,我认为直接递归更容易理解。

所以我们需要一个能够接收列表并执行操作的函数,所以

(define count-odd
  (lambda (ls) SOMETHING))

所以这是递归的,所以我们想要拆分列表

(define count-odd
  (lambda (ls)
    (let ((head (car ls)) (rest (cdr ls)))
      SOMETHING)))

现在这有一个问题,这是一个空列表的错误(例如(count-odd '())),但我会让你弄清楚如何解决这个问题。 提示,检查方案的案例表达,它可以轻松检查和处理空列表

现在有些东西是我们的递归所以类似于:

(+ (if (is-odd head) 1 0) (Figure out how many odds are in rest))

这应该给你一些启动的东西。如果您以后有任何具体问题,请随时发布更多问题。

答案 1 :(得分:1)

请先考虑另一个答案指南,以便您自己尝试。以下是解决它的不同方式。这是一个经过测试的完整解决方案:

(define (count-odd num_list)
    (if (null? num_list)
        0
        (+ (num_odds (car num_list)) (count-odd (cdr num_list)))))

(define (num_odds number)
    (if (zero? number)
        0
        (+ (if (odd? number) 1 0) (num_odds (quotient number 10)))))

这两个程序都是递归

  • count-odd不断获取列表的第一个元素并将其传递给num_odds,直到列表中没有元素为止(即基本情况,空列表)。 / p>

  • num_odds获取数字的奇数位数。为此,请始终询问数字是否为奇数,在这种情况下,它将添加1,否则为0.然后将数字除以10以删除最低有效数字(确定是否为number是奇数或偶数)并作为参数传递给新的调用。重复该过程直到数字为零(基本情况)。

答案 2 :(得分:0)

如果其他一些解决方案看起来很奇怪,请不要混淆。 Simply Scheme使用firstbutfirst的非标准定义。这是一个解决方案,我希望遵循Simply Scheme友好。

以下是解决问题的一种策略:

  • 将数字转换为数字列表
  • 转换为零和1的列表(零=偶数,一个=奇数)
  • 在列表中添加数字

示例:123 - > '(1 2 3) - > '(1 0 1) - > 2

(define (digit? x)
  (<= 0 x 9))

(define (number->digits x)
  (if (digit? x)
      (list x)
      (cons (remainder x 10)
            (number->digits (quotient x 10)))))

(define (digit->zero/one d)
  (if (even? d) 0 1))

(define (digits->zero/ones ds)
  (map digit->zero/one ds))

(define (add-numbers xs)
  (if (null? xs)
      0
      (+ (first xs)
         (add-numbers (butfirst xs)))))

(define (count-odds x)
  (add-numbers 
     (digits->zero/ones 
        (number->digits x))))

以上是未经测试的,因此您可能需要修复一些拼写错误。

答案 3 :(得分:0)

我认为这也是一个好方法。

(define (count-odd sequence)
  (length (filter odd? sequence)))

(define (odd? num)
  (= (remainder num 2) 1))

(count-odd '(234 556 4 10 97))

希望这会有所帮助〜

(长度序列)将返回序列的长度,
(filter proc sequence)将返回一个包含满足proc的所有元素的序列 您可以定义一个名为(odd?num)

的函数