1

数字の桁の合計を計算する方法を知っています:

(define (sum-of-digits x)  
  (if (= x 0) 0
      (+ (modulo x 10) 
         (sum-of-digits (/ (- x (modulo x 10))
                           10)))))`

しかし、桁数を数える手がかりがありません。また、線形反復進行によってそれを行う方法もわかりません。

ありがとう!!

4

2 に答える 2

0

各質問に関するヒント:

  1. 桁数を数える場合、現在の桁を追加する必要はありません(コードの場合のように)。追加するだけ1
  2. 再帰的なソリューション (あなたのもののような) を末尾の再帰 (線形反復進行を生成するもの) に変換するためのいくつかの戦略があります。短いリストは次のとおりです。

    • これまでに蓄積された結果を保持するために、関数に追加のパラメーターを追加します
    • プロシージャを初めて呼び出すときに、アキュムレータの初期値を渡します。通常、これは、「通常の」(非末尾再帰) 再帰の基本ケースで返される値と同じです。
    • 再帰の基本ケースでアキュムレータを返します
    • 再帰ステップで、累積結果を新しい値で更新し、再帰呼び出しに渡します
    • そして最も重要なこと: 再帰を呼び出すときは、「追加作業」を実行せずに最後の式として呼び出すようにしてください。
于 2012-10-04T22:40:01.743 に答える
0

あなたは答えに非常に近いです。

桁の合計を桁数に変更する方法を理解するために、いくつかのテスト ケースを作成してみてください。テスト ケースには、関数を呼び出す例と、期待される結果を含める必要があります。

補足として、これは生成再帰の例であり、「リストに数字を追加する」、「リスト内の要素を数える」などの一連の問題を完了するまで、それに取り組むべきではありません。 .

于 2012-10-04T21:13:46.140 に答える