我对lisp相当新,这是一个练习题。
首先,这个问题来自于scheme
。我不知道如何回答这个问题
这个问题的目的是编写函数count-odd
将一个句子作为输入并计算其中包含多少个奇数位数,如下所示:
(count-odd'(234 556 4 10 97)) 6
或
(count-odd'(24680 42 88)) 0
如果可能,您将如何使用更高阶函数或递归或两者兼而有之 - 无论何时完成工作。
答案 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使用first
和butfirst
的非标准定义。这是一个解决方案,我希望遵循Simply Scheme友好。
以下是解决问题的一种策略:
示例: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)