我有一个作业,我需要计算输入中的对数。
这是我到目前为止所做的:
(define x 0)
(define number-of-pairs
(lambda (v)
(if (pair? v)
(+ x 1)
(+ x 0))))
然后我按如下方式使用它:
(number-of-pairs (cons (cons 'a 'b) 'c))
这里它应该产生2,但它产生1,因为它只通过该函数一次。 如果我试试
(number-of-pairs 10)
它产生0,因为它没有对,因为它应该。
答案 0 :(得分:5)
您必须考虑两种情况:
对于第二种情况,我们可以在总数中添加一个,因为我们知道当前元素是一对,然后我们在对的两个部分调用递归 - 因为我们不知道是否其中一个又是一对。
以下是需要做什么的一般想法,填写空白:
(define (number-of-pairs v)
(if (not (pair? v))
<???>
(+ <???>
(number-of-pairs <???>)
(number-of-pairs <???>))))
使用这些示例来测试您的程序:
(number-of-pairs 10)
> 0
(number-of-pairs (cons (cons 'a 'b) 'c))
> 2
(number-of-pairs '(a b c))
> 3
(number-of-pairs (cons 'a (cons 'b (cons (cons 'c (cons (cons 'd '()) '())) '()))))
> 6
答案 1 :(得分:2)
使用武力,卢克!
ERR。我的意思是使用设计配方。
参见如何设计程序的第9.3和9.4节:
http://htdp.org/2003-09-26/Book/curriculum-Z-H-13.html#node_sec_9.3
如果您不熟悉HtDP,那么理念是为您提供系统编写程序的工具,而不仅仅是举例。
答案 2 :(得分:0)
现在编写时,您的代码将只返回1或0.为了使此过程按预期工作,您需要了解有关方案的两个重要事项:递归调用如何工作以及赋值如何工作。
分配:
我写了一篇非常深入的assignment in scheme细分,但在这种情况下的简短版本是,当您致电x
时,您并未更改(+ x 1)
的值。如果你想在方案中实际更改绑定的值,你必须使用set!
程序(但在这种情况下你真的不需要这样做)。
递归:
回想一下,递归是指从内部调用过程。递归解决方案有两个必要元素:空值和缩减公式。
在加法或减法的情况下,空值为0,对于乘法,它为1,对于cons
,它是空列表'()
。
缩减公式是如何将问题分解为更简单的部分,或者如何使问题更接近于每个步骤解决问题。
示例:
(define count-elements
(lambda (lst)
(if (null? lst) 0 ; <-- I'm done? return the null value
(+ 1 (count-elements (cdr lst)))))) ;<-- otherwise +1 and reduce the problem
由于这是作业,我不会为你明确地解决这个问题,但你的答案应该与count-elements基本相同,你只需要另一个谓词来确定你是否真的需要添加任何东西。