计算Scheme中的对数

时间:2012-04-30 17:00:29

标签: recursion scheme

我有一个作业,我需要计算输入中的对数。

这是我到目前为止所做的:

(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,因为它没有对,因为它应该。

3 个答案:

答案 0 :(得分:5)

您必须考虑两种情况:

  1. 如果当前元素不是一对,会发生什么?
  2. 如果当前元素一对,会发生什么?
  3. 对于第二种情况,我们可以在总数中添加一个,因为我们知道当前元素是一对,然后我们在对的两个部分调用递归 - 因为我们不知道是否其中一个又是一对。

    以下是需要做什么的一般想法,填写空白:

    (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基本相同,你只需要另一个谓词来确定你是否真的需要添加任何东西。