質問するログイン新規登録

回答編集履歴

3

追記した話の意味を書き忘れたので追記

2020/11/27 03:29

投稿

fana
fana

スコア12236

answer CHANGED
@@ -14,6 +14,9 @@
14
14
  ---
15
15
 
16
16
  [追記]
17
+ {関数が呼ばれた回数をカウントする,再帰でコラッツ問題}と,やりたいことが2つ混在している状況です.
18
+ これを同時に考えると混乱するようであれば,1個ずつ順に解決していけば考えやすいのではないでしょうか.
19
+
17
20
  関数が呼ばれた回数をカウントしたいならば,まずはそれだけを素直に書けば以下のようになるでしょう.
18
21
 
19
22
  ```C

2

追記

2020/11/27 03:29

投稿

fana
fana

スコア12236

answer CHANGED
@@ -9,4 +9,31 @@
9
9
  3. やりたいことの意味的には,変数countはおそらくstatic変数にすべきなのではないかと思います.
10
10
 
11
11
  …といった感じで,全体的にぐちゃぐちゃな状態に見えます.
12
- 関数h()が呼ばれる度に引数nの値をprintf()か何かで表示させてみる等して,現状の振る舞いがどうなっているのか(何が起こっているのか)を確認してみることから始めると良いのではないかと思います.
12
+ 関数h()が呼ばれる度に引数nの値をprintf()か何かで表示させてみる等して,現状の振る舞いがどうなっているのか(何が起こっているのか)を確認してみることから始めると良いのではないかと思います.
13
+
14
+ ---
15
+
16
+ [追記]
17
+ 関数が呼ばれた回数をカウントしたいならば,まずはそれだけを素直に書けば以下のようになるでしょう.
18
+
19
+ ```C
20
+ int h( int n )
21
+ {
22
+ static int count = 0; //staticでカウンタを用意.
23
+ ++count; //とくかく呼ばれたらカウンタをインクリメントする.
24
+
25
+ //(処理)
26
+
27
+ return count; //現在のカウンタ値を返す
28
+ }
29
+ ```
30
+
31
+ なので,あとは「コラッツ問題で再帰がどうの」という処理内容を,上記コード内の`//(処理)`の部分に追加すればよいでしょう.
32
+ 「コラッツ問題」でググってwikipediaで見た内容を本当に素直にそのまま書けば,こんな程度↓の内容になるんじゃないでしょうか?
33
+ ```C
34
+ if( n != 1 ) //1じゃないとき
35
+ {
36
+ if(n%2==0){ h(n/2); } //2の倍数なら2で割る
37
+ else { h(n*3+1); } //そうじゃないなら3倍して1足す
38
+ }
39
+ ```

1

結びの分を追記

2020/11/27 03:26

投稿

fana
fana

スコア12236

answer CHANGED
@@ -6,4 +6,7 @@
6
6
  なので,mainからhに1でない値を渡したとき戻り値が何になるのかは謎です.
7
7
  (戻り値を返すべき関数がreturnが無いパスから抜けたときに何が起こるのか? その振る舞いに規定が存在するのかどうかを私は知りませんが,いずれにしろそれが所望の処理ではないであろう,と思います.)
8
8
 
9
- 3. やりたいことの意味的には,変数countはおそらくstatic変数にすべきなのではないかと思います.
9
+ 3. やりたいことの意味的には,変数countはおそらくstatic変数にすべきなのではないかと思います.
10
+
11
+ …といった感じで,全体的にぐちゃぐちゃな状態に見えます.
12
+ 関数h()が呼ばれる度に引数nの値をprintf()か何かで表示させてみる等して,現状の振る舞いがどうなっているのか(何が起こっているのか)を確認してみることから始めると良いのではないかと思います.