在SCHEME中完美的数字递归。 (初学者)

时间:2012-09-13 02:57:09

标签: recursion scheme racket perfect-numbers

嘿所以我正在创建一个函数(除以n),它应该在模数函数的帮助下计算数n中的除数数,并且函数充当从数字n向下的计数器。我的问题是modulo函数应输出true或false,具体取决于数字是否为整数而不是if语句

(if (= (divides n k) #f)
    0

我不确定为什么但代码不会将if语句评估为true或false ..它只是跳过它。我也不确定0应该是正确的输出我希望它只是跳过那个数字而不计算它。

继承我的代码:

(define (divides a b) (= 0 (modulo b a)))
(define (divisors-upto n k)
  (if (= (divides n k) #f)
      0
      (+ k (divisors-upto n (- k 1)))))
(define (divisors n) (divisors-upto n n))

(divisors 4) ;for example should produce the result 3

1 个答案:

答案 0 :(得分:2)

首先修复divides程序,将参数反转为modulo。这应该是它的样子:

(define (divides a b)
  (= 0 (modulo a b)))

以上测试ba,这就是您在divisors-upto程序中使用它的方式。你也应该替换它:

(= (divides n k) #f)

有了这个:

(equal? (divides n k) #f)

甚至更好,这个:

(not (divides n k))

除此之外,这与posted之前的问题不同吗?我在那里告诉你,你错过了递归的案例,请看链接中我之前的答案。

如果它不是同一个程序,那么我不确定你想要做什么:在这个问题中你说过程序“应该计算一个数字中的除数的数量”,但那不是什么过程正在进行 - 您正在添加实际除数(过程中的k参数)而不是除数的数量。而且,你会错过一个案例 - 如果当前k不是除数会怎样?递归会过早退出!尝试解决这个问题,填写空白:

(define (divisors-upto n k)
  (cond ((zero? k)
         <???>) ; how many divisors are there if k is zero?
        ((not (divides n k))
         <???>) ; if k is not a divisor of n, we must proceed without incrementing
        (else   ; if k is a divisor of n, by how many should the count be incremented?
         (+ <???> (divisors-upto n (- k 1))))))