- まず,コードがわりと間違っています.
h()内でh()をコールするとき,全く同じnの値を引数に渡しているのでスタックを食いつぶすまで再帰します.
n==n%2;
とかでは,nの値は更新されないからです.(さらに,扱う問題的に,n%2というのも間違っているように思われる)
- 関数h()内でreturnが書かれているのは
if(n==1){}
のブロック内だけです.
なので,mainからhに1でない値を渡したとき戻り値が何になるのかは謎です.
(戻り値を返すべき関数がreturnが無いパスから抜けたときに何が起こるのか? その振る舞いに規定が存在するのかどうかを私は知りませんが,いずれにしろそれが所望の処理ではないであろう,と思います.)
- やりたいことの意味的には,変数countはおそらくstatic変数にすべきなのではないかと思います.
…といった感じで,全体的にぐちゃぐちゃな状態に見えます.
関数h()が呼ばれる度に引数nの値をprintf()か何かで表示させてみる等して,現状の振る舞いがどうなっているのか(何が起こっているのか)を確認してみることから始めると良いのではないかと思います.
[追記]
{関数が呼ばれた回数をカウントする,再帰でコラッツ問題}と,やりたいことが2つ混在している状況です.
これを同時に考えると混乱するようであれば,1個ずつ順に解決していけば考えやすいのではないでしょうか.
関数が呼ばれた回数をカウントしたいならば,まずはそれだけを素直に書けば以下のようになるでしょう.
C
1int h( int n )
2{
3 static int count = 0; //staticでカウンタを用意.
4 ++count; //とくかく呼ばれたらカウンタをインクリメントする.
5
6 //(処理)
7
8 return count; //現在のカウンタ値を返す
9}
なので,あとは「コラッツ問題で再帰がどうの」という処理内容を,上記コード内の//(処理)
の部分に追加すればよいでしょう.
「コラッツ問題」でググってwikipediaで見た内容を本当に素直にそのまま書けば,こんな程度↓の内容になるんじゃないでしょうか?
C
1if( n != 1 ) //1じゃないとき
2{
3 if(n%2==0){ h(n/2); } //2の倍数なら2で割る
4 else { h(n*3+1); } //そうじゃないなら3倍して1足す
5}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/27 03:56
2020/11/27 04:20