1

0 から n までの 1 の数を再帰的に見つける再帰関数を作成する必要があります。

したがって、f(16) = 9

(1,10,11,12,13,14,15,16)

これは明らかに宿題なので、コードを投稿せず、その背後にある理由だけを投稿していただければ幸いです。

私がこれまでに推論したのは、数値の %10 を実行すると、最下位が 1 であるかどうかがわかります。また、10 で整数除算を実行すると、その桁が失われるということです。

したがって、アプローチはチェックif number%10 == 1してから f(n/10) で関数を呼び出すことができると思いますが、実際の実装で迷子になります。

どのようなアプローチを使用するかコメントしていただければ幸いです。在宅ワークであるという理由だけで再帰的でなければならず、手続き型のアプローチは簡単でした。

4

3 に答える 3

2

この種の問題については、パターンを示すある種の図を書くと役立つことがわかりました。たとえば、十の位まで数えると、最初のセット (0 ~ 9) に 1 が含まれていることがわかります。

(0-9) -- 1
(10-19) -- 11
(21-29) -- 1
| | | -- 1
(100-109) -- 11
(110-119) -- 21
(120-129) -- 11
| | | -- 11
(200-209) -- 1
(210-219) -- 11
(220-229) -- 1
| | | -- 1
...
(1000-1009) など...

しばらく時間がかかる場合がありますが、これはパターンを見つけるのに役立ち、より体系的な答えを導き出すことができます. 宿題なのであまり手伝いたくないのですが、クリエイティブな数学の問題を解くときは、この方法をとっています。

于 2012-08-26T23:42:18.667 に答える
1

あなたのアプローチはまったく正しいです。すべての数値に対して、10 進数表現で「1 の数」を返す関数が必要です。これを再帰的に表現します (これを繰り返し行うこともできます)。

すべての再帰関数と同様に、最終状態のキャッチが必要です。つまり、入力 = 0 が 0 を返す場合です。それに加えて (すべてを渡さずに) 現在の結果をサブ結果に追加するだけです。

 if number==0
     return 0
 if number%10==1
     return myFunc(number/10) + 1
 else
     return myFunc(number/10)

ただし、前に述べたように、再帰を使用する必要はありません。関数は桁数に関して線形であるため、ここでは反復解法がおそらく優れています。

于 2012-08-26T23:39:10.580 に答える
1

問題には 2 つの部分があります。

  1. 数で1の数を見つける.
  2. それよりも小さい (ただしゼロよりも大きい) すべての数から 1 の数を見つけます。

最初のパート 1:

右端の桁が 1 の場合、number % 10 == 1. 数値が > 9 の場合は、他の数字をチェックする必要があります。これを行うには、10 を整数で割った後の数値に対して同じテストを実行します。数値が <= 9 の場合、ゼロになります。

したがって、 OnesInNumber 関数は次のようになります。

  1. 数値 == 0 の場合、0 を返します。
  2. それ以外の場合は、OnesInNumber を呼び出しますnumber / 10
  3. number % 10 == 1その結果に 1 を加える場合。
  4. 結果を返します。

これは、たとえば、 、 、 、 、 、 、、、などで1呼び出されたときにあなたを与えます。10112303212211

OnesInZeroUntil 関数は次のようになります。

  1. 数値 <= 0 の場合、0 を返します。
  2. それ以外の場合は、OnesInZeroUntil を呼び出しますnumber - 1
  3. これに追加OnesInNumber(number)します。
  4. 結果を返します。

したがって、ある数の数を計算する再帰関数と、その最初の関数に基づいて、その数までのすべての数1の数を計算する別の再帰関数があります。1

リクエストがなければ、簡単な 2 つの関数を記述するだけで十分です。

(ヒント: 先生がまだ要求していない場合は、再帰を使わずにこれを行う方法を考えてみてください。すべての再帰関数は非再帰形式として書き直すことができます。再帰を教えている一部の人々はカバーしていないようです)。

于 2012-08-26T23:45:08.900 に答える