2017-09-20 7 views
1

以下の問題で再帰のロジックを見つけることができません。 負でないint nが指定された場合、7の出現回数を数字として返します。コーディングバット初心者再帰

例: Count7(777)= 3

例: Count7(123)= 0

例: Count7(171)=

1は、ここで私はものの場所に7の

カウント数を適用していない+他のすべての場所に7の一切をカウントロジックです。

例えば7の13767

カウント数(1)+カウント数7オフ(3767)で、ちょうど* 4 5!= 5階乗のプログラムのように!

count7(n) 
{ 
    if (n==0) { 
     return 0; 
    } 
    if (n==7) { 
     return 1; 
    } 
    if (n!=7) { 
     return 0; 
    } 
    return count7(n%10)+count7(n/10) 
} 

ご迷惑をおかけして申し訳ございません。あなたはnとして

if (n!=7) return 0; 

続い

if (n==7) return 1; 

を持って

+4

は、私は、これは 'Count7は(171)= 0 'が' 1であると予想しました'それが* 7であるから – babon

+1

BTW:' count7(n) 'が間違っていて、' int count7(n) 'でなければなりません。そして、あなたのC教科書のように、あなたのコードを正しくフォーマットしてください。 –

+2

'n'は' 7'かそうでないので最後の行は決して実行されません。 – Groo

答えて

2

は後に来るすべてが呼び出されることはありません、7か7のいずれかです。あなたは以上の1桁と数字のための再帰を呼び出して、あなたが最後の桁に達した場合は、ここ壊したくその代わりに、あなたはおそらく

if (n<10) return 0; 

をしたいです。これはまた、n<10で覆われているよう

ところで、あなたはまた、if (n==0)一部を削除することができます。

+0

'n <0'の場合も考えられますが、 7かどうか7は有効です - OPコードは決して再発しません。 –

0

ベースケースでは、数字が1つだけで、数字が7であるかどうかがチェックされます。次に、残りの桁に7の数を再帰的に追加します(rem == 7 ? 1 : 0)。これは単なる骨なしのプログラムです。私はあなたがここからピックアップできると確信しています。

#include <stdio.h> 

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

    if (rem == i) { // base case - check for a single digit. 
     if (rem == 7) 
      return 1; 
     else 
      return 0; 
    } else { 
     return (rem == 7 ? 1 : 0) + count7(quo); 
    } 
} 

int main(void) { 
    int i = 12; 
    printf("%d\n", count7(i)); 
} 
0

次のコードは完全に機能しています。

#include<stdio.h> 
void main() 
{ 
printf("%d\n",count7(717)); 
} 
int count7(int n) 
{ 
if(n==7) 
    return 1; 
else if(n<10) 
    return 0; 
else 
    return count7(n%10)+count7(n/10); 
} 
0

私はあなたのコードで見つかったいくつかの問題、

critical problemがありますが、組み合わせはその条件if() {} else {}を掲載する等しくなりますn==7

かどうかを確認n!=7場合、あなたbeforあなたがチェックしていることですこの場合、 は次の行には行きません。return count7(n%10)+count7(n/10)決してない!!!!

私が見たもう一つのことは、数字の残りの部分でcount7に戻ることを呼び出すことです、それは動作しますが、あなたが単純な操作を行う必要がある場合(残っている場合のみ== 7)アドバイスは? :の状態に使い、必要がなければ機能にジャンプしないことです。

あなたの問題への私のコード:

int count7(int n) 
{ 
    return n==0 ? 0 : (n==7 ? 1 : count7(n/10) + (n%10 == 7 ? 1 : 0)); 
} 

そして、別のコードより読み取り可能に(同じ作業を行う):

int count7(int curNum) 
{ 
    int curModNum=n%10; 
    int curDivNum=n/10; 
    if (currentNum==EMPTY_NUM) { 
     return EMPTY_NUM; 
    } 
    if (curNum==LUCKY_NUM) { 
     return ADD_ONE; 
    } 
    return count7(curDivNum) + (curModNum == LUCKY_NUM ? ADD_ONE : EMPTY_NUM); 
} 
+0

ええ、それを持って...清算のためにありがとう。私が再帰をうまくすることができる方法はありますか? – CryBaby

+0

最良の方法は練習であり、必要なときにだけ使用してください:) – Bizzu

+0

問題は基本ケースであり、再帰関数ではありませんでした – CryBaby