0

数値の約数を数える関数の作成に取り組んでいます。たとえば、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 ))
4

1 に答える 1

1

手順は原則として良さそうです。手順dividesが正しく実装されている限り、問題なく動作するはずです。例えば:

(divisors 10)
=> 4 ; 10, 5, 2 and 1 are divisors of 10

参考までに、「メイン」プロシージャから 1 つ以上の追加パラメーターを使用して呼び出されるヘルパー プロシージャがあり、そのヘルパー プロシージャが他の場所で使用されることがない場合は、ヘルパーを内部定義として宣言することをお勧めします。例:

(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))
于 2013-09-05T18:49:48.583 に答える