1

36などの数字を取り、それを逆にして言う関数があります

'(6 3)

その 6 3 を組み合わせて 1 つの数にする方法はありますか?

これが私が書いたコードです。

    (定義 (number->rdigits num)
      (if (rdigits (/ (- num (mod num 10)) 10)))))


    (リバーシブルを定義しますか?
      (ラムダ (n)
        (状態
          [(null? n) #f]
          [else (odd? (+ n (list (number->rdigits n))))])))

ありがとう!

4

1 に答える 1

0

これは、リストの各要素を順番に取得して結果を累積する反復関数を使用して行うことができます。例えば:

(define (make-number lst)
  (define (make a lst)
     (if (null? lst)
         a
         (make (+ (* 10 a) (car lst)) (cdr lst))))
  (make 0 lst))

(display (make-number '(6 3)))

このmake関数は、アキュムレータaと残りの桁を使用lstして、一度に 1 ステップずつ最終結果を構築します。

a = 0
a = 0*10 + 6 = 6
a = 6*10 + 3 = 63

リストにさらに数字がある場合、これは続きます。

a = 63*10 + 5 = 635
a = 635*10 + 9 = 6359

単一の関数を使用する非効率的な実装は、次のようになります。

(define (make-number lst)
  (if (null? lst)
      0
      (+ (* (expt 10 (length (cdr lst))) (car lst)) (make-number (cdr lst)))))

この関数は、length反復ごとにリストの残りを計算するだけでなく、expt関数を繰り返し呼び出す必要があります。また、この実装は適切に末尾再帰的ではないため、実行中に複数のスタック フレームを構築してから、再帰の最大深度に達した後にそれらをすべてアンワインドします。

于 2012-10-09T04:38:56.953 に答える