2

以下は、再帰を使用して数値の逆数を返すことを意図した関数です。ただし、数値の最後の桁のみを返します。原因と修正方法を知りたいのですが?

int rev(int number)
{
      int revNum=0, sum=100;

      if(number<=9) return(number);
      else if(number>0) 
      {
           return(rev(number/10)+revNum);
           revNum=(number%10)*sum; sum=sum/10;

      }
}

ありがとうございました!!!

4

8 に答える 8

12

ここにいくつかの作業コードがあります:

int rev (int number){
    int base = 1;

    while (number / (base * 10)){/*
        * This calculates the base of the number
        * ie number = 435
        *    base   = 100
        */
        base *= 10;
    }

    if (number <= 9){
        return number;
    } else if (number >= 10){ // notice different expression
        int revNum = (number % 10) * base; // this was out of order
        return rev (number / 10) + revNum;
    }
}

上記でコメントしたこと以外に、コードが機能しなかった主な理由はsum、呼び出し内に保存されていないことです。これは、再帰関数を作成する際の一般的な問題です。

これを解決するために、「ベース」は固定値を持つ代わりに、関数呼び出しごとに計算されます。100これは、 (選択したコードの別の制限)よりも大きくない数ではなく、より大きな数を渡すことができるため、少し優れています。

もう 1 つの実装は、ベースを 2 番目のパラメーターとしてベースにすることです。これにより、関数呼び出しごとに再計算する必要がなくなります。ただし、これは単純なマクロで簡単に修正できます。呼び出しは次のようになります。

int rev_number (int number, int base){ .. }

しかし、 a は便利にマクロ (または他の関数呼び出し) に配置できます。

#define rev(num) rev_number (number, 0)

これはもう少し効率的ですが、違いは重要かもしれませんし、そうでないかもしれません。

于 2013-07-18T06:55:40.750 に答える
7
int rev(int num){
    return num < 10 ? num : (num % 10) * pow(10, (int)log10(num)) + rev(num/10);
}

しかも一行で完了。

于 2013-07-18T07:20:10.697 に答える
1

このスニペットが役立つかもしれません:

//init reversed number with last digit of number
reversed_number=number % 10;
//remove the last digit of number
number=number / 10;

//if number has another digit...
while (number > 0)
{
    //...shift left all digits of the reversed_number by one digit
    //    and add the last digit of number
    reversed_number=reversed_number*10+(number % 10);
    //remove the last digit of number
    number=number / 10;
}

...後で追加...

再帰的なバリアントは次のようになります (目的の署名を得るために 2 つの関数を使用しました)。

int rev(int number)
{
    return rev_ext(0,number);
}

int rev_ext(int result, int number)
{
    if (number<10)
    {
        return result*10+number;
    }
    else
    {
        result=result*10 + number % 10;
        return rev_ext(result, number / 10);
    }
}

より短く/最適化して書くことができると確信しています;-)

*ヨスト

于 2013-07-18T06:27:57.280 に答える
0

この再帰バージョンを確認してください。

#include <stdio.h>  
#include<math.h>
int main()                                                  
{
  int n=345;
  printf("%d",rev(n));
}
int len(int number) 
{
  int i;
  for(i=0;number>0;number=number/10,i++);
  return i;
}
int rev(int n)
{
   if (n==0) return 0;
   int val=0;
   val=n%10;
   return (val * pow(10,len(n)-1)+rev(n/10));
}
于 2013-07-18T07:30:27.200 に答える
0

再帰的な解決策は次のとおりです。

#include <stdio.h>
#include <string.h>

main()
{
   int pow(int a, int b){
        int p = 1;
        while(b){
            p = p * a;
            b--;
        }
        return p;
    }

    int len(int number) {
        int i = 0;
        while (number) {
            number/=10;
            i++;
        }
        return i;
    }

    int rev(int number) {
        int revNum=0;
        int i = len(number) - 1;

        if(number<=9) {
            return number;
        } else {
            return(number%(10)*pow(10,i) +rev(number/10));
        }
    }
    printf("%d",rev(1234));
}
于 2013-07-18T06:39:10.590 に答える