Recursion 方案中的完全数递归。(初学者)

Recursion 方案中的完全数递归。(初学者),recursion,scheme,racket,perfect-numbers,Recursion,Scheme,Racket,Perfect Numbers,嘿,所以我创建了一个函数(除数n),它是用来计算一个数n中的除数,借助于一个模函数和一个从数n向下的计数器函数。我的问题是模函数应该输出一个true或false,这取决于我的if语句中的数字是否为整数 (if (= (divides n k) #f) 0 我不知道为什么,但是代码不会将if语句计算为true或false。。它只是跳过了它。另外,我不确定0是否应该是正确的输出,我希望它跳过这个数字,而不是计数 这是我的密码: (define (divides a b) (= 0 (mod

嘿,所以我创建了一个函数(除数n),它是用来计算一个数n中的除数,借助于一个模函数和一个从数n向下的计数器函数。我的问题是模函数应该输出一个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

首先修复
除法
过程,将参数反转为
。它应该是这样的:

(define (divides a b)
  (= 0 (modulo a b)))
以上测试如果
b
除以
a
,这就是您在
除数直至
过程中使用它的方式。此外,您还应替换此:

(= (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))))))
(定义(高达n k的除数)
(cond((零?k)
)如果k为零,有多少个除数?
((非(n/k))
);如果k不是n的除数,我们必须不加递增
(否则,如果k是n的除数,那么计数应该增加多少?
(+(除数高达n(-k1()())))

是的,我一直在用几种方法处理这个函数。谢谢你的帮助,我会尝试一下。我从来没有想过这样做,但现在我发现你可以将
而不是
简单地定义为
(cut eq?#f)
。一般来说,布尔比较的想法对我来说是如此的冒犯,以至于我的脑子里已经记不清了整个想法。:-)@罗克:太好了!请不要忘记接受在这个问题和其他问题上对你最有帮助的答案——只需点击他们左边的复选标记。