Scheme 方案:寻找因子

Scheme 方案:寻找因子,scheme,Scheme,我正在写一个计算一个数的除数的函数。例如,4将有3个除数。我编写了一个助手函数,如下所示: (define (divisors-upto n k) (cond((= k 0) 0) ((= n 0) 0) ((= k 1) 1) ((divides k n) (+ 1 (divisors-upto n (- k 1)))) (else (divisors-upto n (- k 1))))) 但是在我的下一个函数中,我很难正确地使用助手函数。

我正在写一个计算一个数的除数的函数。例如,4将有3个除数。我编写了一个助手函数,如下所示:

(define (divisors-upto n k)
  (cond((= k 0) 0)
      ((= n 0) 0)
      ((= k 1) 1)
      ((divides k n) (+ 1 (divisors-upto n (- k 1))))
      (else (divisors-upto n (- k 1)))))
但是在我的下一个函数中,我很难正确地使用助手函数。下面的函数可以计算除数吗

(define ( divisors n ) ( divisors-upto n n ))
这个程序原则上看起来不错。只要程序
正确执行,它就可以正常工作。例如:

(divisors 10)
=> 4 ; 10, 5, 2 and 1 are divisors of 10
(define (divisors n)
  (define (divisors-upto n k)
    (cond ((= k 0) 0)
          ((= n 0) 0)
          ((= k 1) 1)
          ((divides k n) (+ 1 (divisors-upto n (- k 1))))
          (else (divisors-upto n (- k 1)))))
  (divisors-upto n n))
仅供参考,当您有一个helper过程,该过程使用“main”过程中的一个或多个额外参数调用,并且helper过程永远不会在其他地方使用时,最好将helper声明为内部定义,例如:

(divisors 10)
=> 4 ; 10, 5, 2 and 1 are divisors of 10
(define (divisors n)
  (define (divisors-upto n k)
    (cond ((= k 0) 0)
          ((= n 0) 0)
          ((= k 1) 1)
          ((divides k n) (+ 1 (divisors-upto n (- k 1))))
          (else (divisors-upto n (- k 1)))))
  (divisors-upto n n))

如果您尝试它会发生什么?作为一种优化,将((除以kn)(+1(除数高达n(-k1)))更改为((除以kn)(+2(除数高达n(-k1)))并调用(定义(除数n)(let((root(sqrt n))(if(integer?root)(+1(除数高达n根))(除数高达n(floor root)))和最小(=n0)0)大小写转换为除数,所以只需检查一次。