ここにいくつかの作業コードがあります:
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)
これはもう少し効率的ですが、違いは重要かもしれませんし、そうでないかもしれません。