嘿所以我正在创建一个函数(除以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
答案 0 :(得分:2)
首先修复divides
程序,将参数反转为modulo
。这应该是它的样子:
(define (divides a b)
(= 0 (modulo a b)))
以上测试b
除a
,这就是您在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))))))