2

1より大きい整数の適切な約数の合計を計算する関数を作成する方法を知りたい.

(define (sum-of-proper-divisors n)
          (cond
           [(= n 1) 1]
           [(= 0 (remainder n (sub1 n)))
            (+ (remainder n (sub1 n)) (sum-of-proper-divisors (sub1 (sub1 n))))]
           [else (sum-of-proper-divisors (sub1 n))]))

これは私が書いたコードですが、動作しません。常に n-1 を実行するため、評価が停止することはありません。そして、これを修正する方法がわかりません。また、他にも問題がある可能性があります。除数が 1 になったときに関数の評価を停止する制限をどのように設定しますか?

4

1 に答える 1

1

n除数を見つけたい数と、その除数を混同しています。n決して変更されないことに注意してください。各ステップで変更する必要があるのは、テストされている現在の整数 (可能な除数) です。そのためには、2 つのパラメーターを渡す必要があります。

(define (sum-of-proper-divisors n i)
  (cond
    [(= i 1) 1]
    [(= (remainder n i) 0)
     (+ i (sum-of-proper-divisors n (sub1 i)))]
    [else (sum-of-proper-divisors n (sub1 i))]))

次のように呼び出します。最初iは より 1 単位小さくなければなりませんn

(sum-of-proper-divisors 10 9)
=> 8

パラメータが 2 つあるのが気になる場合は、1 つのパラメータを渡す方法がいくつかあります。たとえば、named を使用しますlet

(define (sum-of-proper-divisors n)
  (let loop ((i (sub1 n)))
    (cond
      [(= i 1) 1]
      [(= (remainder n i) 0)
       (+ i (loop (sub1 i)))]
      [else (loop (sub1 i))])))
于 2013-11-04T02:01:42.813 に答える