3

私は昨日の試験でこの問題を抱えていました。私はそれを解決できなかったので、あなたは結果を想像することができます...

再帰関数を作成します。intinvertint(int num)は整数を受け取り、それを返しますが、反転します。例:321は123として返されます。

私はこれを書いた:

int invertint( int num ) {
  int rest = num % 10;
  int div = num / 10;
  if( div == 0 ) {
     return( rest );
  }
  return( rest * 10 + invert( div ) )
}

2桁の数字では機能しますが、3桁以上では機能しません。321は最終段階で1*10+23を返すので。

どうもありがとう!

PS:この種の再帰の問題をより速く理解する方法はありますか、それとも自分自身の想像力次第ですか?

4

7 に答える 7

3
int invertint( int num ) {
  int i ;

  for(i=10;num/i;i*=10);
  i/=10;
  if(i == 1) return num;
  return( (num % 10) * i + invertint( num / 10 ) );
}
于 2012-07-05T15:19:21.940 に答える
1

あなたの間違いは、最後のステートメントであなたが。を掛けているということrestです10。なぜだけ10rest数字の残りの部分に残っている桁数だけ桁をシフトする必要があります。シフトは1つだけです。2桁の数字でのみ機能するのも不思議ではありません。

最後の部分は、の線に沿って行う必要があります

int tail = invert( div );
int deg = /* number of digits in `tail` */;
return rest * (int) pow(10, deg) + div;
于 2012-07-05T15:09:38.997 に答える
0

逆の場合は、カウンターは必要ありません。

int invertint(int num)
{
    if (0 == num || 0 == num % 10) {
        return num / 10;
    }
    int digits = floor(log10(num)) + 1;
    int modulus = pow(10, digits - 1);
    return invertint(num % modulus) * 10 + num / modulus;
}

これは私が最初に思ったほど単純ではないことに注意してください-私は数学を使わなければなりませんでした。

于 2012-07-05T15:04:58.297 に答える
0

問題はにありreturn(rest * 10 + invert(div))ます。自分で掛け算をすることはできません。係数は関数が繰り返される回数に依存するため、関数の2番目の引数としてキャリーを指定する必要があります(キャリーは0で初期化されます)

于 2012-07-05T15:05:09.887 に答える
0
int reverse(int no,int rev)
{
if(no!=0)
return reverse(no/10,rev*10+no%10);
else
return rev;
}

このメソッドをreverse(numberToReverse、0)として呼び出します

于 2012-07-05T15:03:33.430 に答える
0

別の方法として、これは再帰なしで実行できます。

    int invertint(int num)
    {
        int res = 0;
        while (num != 0)
        {                
            res = res * 10 + (num % 10);
            num /= 10;
        }
        return res;
    }

ただし、再帰が割り当てであるため、int(int)シグネチャを指定すると、pow(log10))バリエーションを使用するのが最も簡単です(math.hを含めることが許可されている場合?)

    int invertint(int num)
    {
        if (num == 0) return 0;
        return invertint(num / 10)  +  (int)pow(10, (int)log10(num)) * (num % 10);
    }
于 2012-07-05T15:04:27.907 に答える
-1

これが最も簡単なアプローチです。

int sum=0;
int reverse(int n)
{
    if(n>0)
    {
        sum=(sum*10)+(n%10);
        reverse(n/10);
    }
    return sum;
}
于 2017-06-09T12:50:11.733 に答える