1

嘿,所以我正在创建一个函数(除数 n),它应该借助模函数和一个充当从数 n 向下的计数器的函数来计算数 n 中除数的数量。我的问题是模函数应该输出真或假,这取决于数字是否是整数,但是我的 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
4

1 回答 1

2

从修复divides过程开始,您将参数反转为modulo. 它应该是这样的:

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

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

(= (divides n k) #f)

有了这个:

(equal? (divides n k) #f)

或者更好的是,这个:

(not (divides n k))

除此之外,这不是您之前发布的同一个问题吗?我在那里告诉你,你在递归中遗漏了一个案例,请查看我之前在链接中的答案。

如果它不是相同的程序,那么我不太确定您想要做什么:在这个问题中,您声明该程序“应该计算一个数字中的除数”,但这不是程序是什么做 - 你正在添加实际的除数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))))))
于 2012-09-13T03:03:50.870 回答