2017-09-18 8 views
1

私は再帰を練習していて、問題に対する私の解決策はうまくいかないようです。 私は、数字の数字が昇順であるかどうかを判断する再帰的なコードを書こうとしています。ここに私のコードは次のとおりです。数字の数字が昇順であるかどうかを判断する再帰関数

#include <stdio.h> 
int isAscending(int num); 
int main(){ 
    int result; 
    result = isAscending(123);//Should print "The number is in ascending order!" 
    if (result == 0) { 
     printf("The number is in ascending order!\n"); 
    } 
    else { 
     printf("The number is not in ascending order!\n"); 
    } 
} 
int isAscending(int num) { 
    int new = num/10; 
    int result = 0; 
    if ((num % 10) == 0) { 
     return 0; 
    } 
    else if ((num % 10) > (new % 10)) { 
     result += isAscending(num/10); 
     return result; 
    } 
    else { 
     return 1; 
    } 
} 
+1

So. 「うまくいかない」とはどういう意味ですか?そして、数字が「0」の場合、なぜあなたは終了していますか? –

+0

通常、再帰関数はそれ自身を呼び出します。私はあなたの 'isAscending(...)でそれを見ない' – cleblanc

+1

また、あなたはなぜ*結果を追加していますか? –

答えて

0

あなたはrecurrsiveコードの下にしてみてくださいすることができ:

`

boolean isascending(int num){ 

if(num == 0) return true; 
if(num%10>num%100) return isascending(num/10); 
else return false; 
}` 

またはループしているときに使用できます。

while(num>0){ 
if(num%10 > num%100){ 
    num = num/10; 
    continue; 
} return false; 
} return true; 
+0

OPはこの質問を 'C'とタグ付けしました。あなたのプログラムは完全ではありません/そのまま実行されません。 – babon

+0

どちらもさまざまなテストに失敗しました。レビュー/テストしたいことがあります。 – chux

0

はそれが良いだろう最後の桁を格納するために別のパラメータを使用します。最後の桁は、現在の反復で「削除」されます。

だから私は、次の再帰的なロジックを思い付いた:

  • 最後の桁が

  • ベースケースを落とした格納パラメータを使用します。番号は0、return 0true)である場合を

  • 数値の現在の最後の桁を計算する(数字%10)

  • 現在の最後の数字は最後の桁より大きい場合はドロップ:この場合で、return 1は(false

  • ない場合、現在の最後の桁を落とす新しい番号にisAscendingRecursive()を返し、次の反復として渡し最後の桁。

コード:

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char** args){ 
    int num=0; 
    printf("Insert a number:\n"); 
    scanf("%d",&num); 
    if(isAscending(num)==0) 
     printf("Ascending\n"); 
    else 
     printf("Not ascending\n"); 
} 

int isAscending(int num){ 
    return isAscendingRecursive(num,9); 
} 

int isAscendingRecursive(int num, int lastDigit){ 
    if(num == 0) 
     return 0; 

    int temp = num%10; 
    if(temp > lastDigit) 
     return 1; 
    else 
     return isAscendingRecursive(num/10, temp); 
} 
-1

私は私のコードを固定し、それが動作し、助けてくれてありがとう!:

#include <stdio.h> 
int isAscending(int num); 
int main(){ 
    int result; 
    result = isAscending(2589);//Should print "The number is in ascending order!" 
    if (result == 0) { 
     printf("The number is in ascending order!\n"); 
    } 
    else { 
     printf("The number is not in ascending order!\n"); 
    } 
} 
int isAscending(int num) { 
    int new = num/10; 
    int result = 0; 
    if ((num % 10) == 0) { 
     return 0; 
    } 
    else if ((num % 10) > (new % 10)) { 
     return isAscending(num/10); 
    } 
    else { 
     return 1 + isAscending(num/10); 
    } 
} 
+0

この回答は '10、20、101、etc'が昇順であることを間違って報告します。また、 'isAscending()'は、関数名から逆方向に音を出すときにゼロを返します。 'int result = 0;'は値を提供しません。 – chux

+0

なぜ「0」に '0'を返しますか? – chqrlie

2

ここではそれについて移動するために別の(最低限)の方法があります。基本的な考え方は、1桁の数字がある場合は肯定を返し、そうでなければ、最も右の数字が残っている数字よりも大きいかどうかをチェックします。残りの数字についてはこれを行います。

#include <stdio.h> 

int isAsc(int i) 
{ 
    int rem = i % 10; // remainder 
    int quo = i/10; // quotient 

    if (rem == i) 
     return 1; 
    else if (rem <= (quo % 10)) 
     return 0; 
    else 
     return 1 && isAsc(quo); 
} 

int main(void) 
{ 
    int i = 123123; 
    if (isAsc(i)) 
     printf("%s\n", "Ascending"); 
    else 
     printf("%s\n", "Not ascending"); 

    return 0; 
} 
+0

'isAsc(-123)'は0を返すことに注意してください。OPが負の値をどのように扱うかは不明です。 – chux

+0

'return 1 && isAsc(quo);' - > 'return isAsc(quo);' – chux

+0

@chuxちょっと、私は負の値をどうしたらいいのか分かりませんでした。はい、それは単純化することができますが、まるですべての結果が '&&'で実行されていると思って最終的な結果が返されるようなものです。 – babon

0

このソリューションは、失敗した場合は0を返し、それ以外の場合は成功した整数を返します。 isDescending()が失敗値として0を返すときに書くことが容易であるようですが、私はそれに応じてこれをゆがめ:

#include <stdio.h> 
#include <stdlib.h> 

int isAscending(int num) { 
    int quotient = num/10; 
    int remainder = num % 10; 

    if (quotient != 0) { 

     int result = isAscending(quotient); 

     if (result == 0 || result >= remainder) { 
      return 0; 
     } 
    } 

    return remainder; 
} 

int main(int argc, char **argv) { 
    if (isAscending(atoi(argv[1]))) { 
     printf("The number is in ascending order!\n"); 
    } else { 
     printf("The number is not in ascending order!\n"); 
    } 

    return 0; 
} 

TESTS

% ./a.out 123 
The number is in ascending order! 
% ./a.out 321 
The number is not in ascending order! 
% ./a.out 101 
The number is not in ascending order! 
% 

いいえ、それは負の数を処理しません!また、入力として '0'も正しく処理されません。他の1桁の数字は問題ありません。

ここでも、isDescendingは()書きする方が簡単ですが、残念ながら、!)(isDescending!= isAscending()

0

あなたのテストが間違っています。最後の数字は以下休息のための前の1と再帰になっている場合は、単一の数字と数字のためにfalseをtrueを返す必要があります:あなたが結果を返すよう再帰のこの種は、末尾再帰と呼ばれている

int isAscending(int num) { 
    int new = num/10; 

    if (new == 0) { 
     return 1; 
    } else 
    if (num % 10 <= new % 10) { 
     return 0; 
    } else { 
     return isAscending(new); 
    } 
} 
再帰呼び出しの良いコンパイラはこれに相当する反復コードを生成します:

int isAscending(int num) { 
    for (;;) { 
     int new = num/10; 

     if (new == 0) { 
      return 1; 
     } 
     if (num % 10 <= new % 10) { 
      return 0; 
     } 
     num = new; 
    } 
} 
関連する問題