こんにちは。
学校の課題で再帰関数の問題が出たのですがちょっとわからないところがあって困っています。
課題の内容は入力された複数のデータ(値)の合計を求める再帰関数を作ることです。
そして入力されたデータを中央で分けて、前半と後半をそれぞれの再帰関数を呼びだすというもの。
Sum(data,0,5) + Sum(data,6,11);
みたいな感じでです。
そして途中までは作ったのですが下のソースでいう「計算のやりかたを入れる」の場所がいまいちわかりません。
まずこの場合は11個データを入れるので真ん中の6個目で区切るためのものが必要なんですが
その作り方もいまいちわかりません;
どなたかわかる方いましたら教えてください<(_ _)>
#include<stdio.h>
int Sum(int Data[x], int StartID; int EndID);
{
ここに計算のやりかたを入れる
}
int main(void)
{
int x;
int Data[11];
for(x = 0; x <11; x++)
{
printf("%d番目の数字を入力してください:",x);
scanf("%d",&Data[11]);
}
}
C++ 再帰関数
Re:C++ 再帰関数
[color=#e0e0ff" face="monospace]
#include<stdio.h>
int Sum(int Data[/url], int StartID, int EndID)
{
    if(StartID != EndID)
        return Sum(Data, StartID, (StartID+EndID)/2)+Sum(Data, (StartID+EndID)/2+1, EndID);
    return Data[StartID];
}
int main(void)
{
    int x;
    int Data[11];
    for(x = 0; x <11; x++)
    {
        printf("%d番目の数字を入力してください:", x+1);
        scanf("%d",&Data[x]);
    }
    printf("合計は%d\n",Sum(Data, 0, 10));
    return 0;
}[/color]
例えば、このようなプログラムで配列Data内の全ての要素の合計を求める事ができます。
しかし、宿題として求められているのは違うものではないでしょうか?
上記のプログラムには再起処理をする意味も理由も全くありません。
配列の要素の合計を求めるだけならば、
[color=#e0e0ff" face="monospace]
int Sum(int Data[/url], int StartID, int EndID)
{
    int sum = 0;
    for( int i = StartID; i <= EndID; i++)
        sum += Data;
    return sum;
}[/color]
というように、再起処理を行わずにもっと簡単にできてしまうからです。
問題が悪いだけ、という可能性ももちろんありますが
Aruさんが題意を取り違えていないか、もう一度確認した方が良さそうです。
また、関数定義の部分や、scanfでの配列・アドレスの扱い方にもミスがあるので
そこも確認し直してみてください。
#include<stdio.h>
int Sum(int Data[/url], int StartID, int EndID)
{
    if(StartID != EndID)
        return Sum(Data, StartID, (StartID+EndID)/2)+Sum(Data, (StartID+EndID)/2+1, EndID);
    return Data[StartID];
}
int main(void)
{
    int x;
    int Data[11];
    for(x = 0; x <11; x++)
    {
        printf("%d番目の数字を入力してください:", x+1);
        scanf("%d",&Data[x]);
    }
    printf("合計は%d\n",Sum(Data, 0, 10));
    return 0;
}[/color]
例えば、このようなプログラムで配列Data内の全ての要素の合計を求める事ができます。
しかし、宿題として求められているのは違うものではないでしょうか?
上記のプログラムには再起処理をする意味も理由も全くありません。
配列の要素の合計を求めるだけならば、
[color=#e0e0ff" face="monospace]
int Sum(int Data[/url], int StartID, int EndID)
{
    int sum = 0;
    for( int i = StartID; i <= EndID; i++)
        sum += Data;
    return sum;
}[/color]
というように、再起処理を行わずにもっと簡単にできてしまうからです。
問題が悪いだけ、という可能性ももちろんありますが
Aruさんが題意を取り違えていないか、もう一度確認した方が良さそうです。
また、関数定義の部分や、scanfでの配列・アドレスの扱い方にもミスがあるので
そこも確認し直してみてください。
Re:C++ 再帰関数
レスありがとうございます<(_ _)>
この課題で初めて再帰関数を使ったので
再帰関数を使う練習も兼ねてるんだと思います。
そしてこの計算を再帰関数を使ってやる利点は
前半と後半の計算は独立しているので高速化されると書いてあります。
RE>関数定義の部分や、scanfでの配列・アドレスの扱い方にもミスがあるので
そこも確認し直してみてください。
確認しました><;
いろいろとミスってましたね。。。
Eeelさんが教えてくださったミスを修正し、自分なりにこれに再帰関数を取り入れてまたちょっと作ってみます!
またわからなくなったらここに書きこむかもですが
お時間あればまたお願いします<(_ _)>
いろいろと丁寧に教えてくださりありがとでした!
では作ってきますε=(ノ゜д゜)ノ
(。-ω-。)----------キリトリ線----------(。-ω-。)
スイマセン。勘違いしてましたね><;
気づくのにかなり時間がかかりましたが
再帰関数使ってありましたね スイマセン('A
ありがとうございました<(_ _)>
この課題で初めて再帰関数を使ったので
再帰関数を使う練習も兼ねてるんだと思います。
そしてこの計算を再帰関数を使ってやる利点は
前半と後半の計算は独立しているので高速化されると書いてあります。
RE>関数定義の部分や、scanfでの配列・アドレスの扱い方にもミスがあるので
そこも確認し直してみてください。
確認しました><;
いろいろとミスってましたね。。。
Eeelさんが教えてくださったミスを修正し、自分なりにこれに再帰関数を取り入れてまたちょっと作ってみます!
またわからなくなったらここに書きこむかもですが
お時間あればまたお願いします<(_ _)>
いろいろと丁寧に教えてくださりありがとでした!
では作ってきますε=(ノ゜д゜)ノ
(。-ω-。)----------キリトリ線----------(。-ω-。)
スイマセン。勘違いしてましたね><;
気づくのにかなり時間がかかりましたが
再帰関数使ってありましたね スイマセン('A
ありがとうございました<(_ _)>
Re:C++ 再帰関数
> そしてこの計算を再帰関数を使ってやる利点は
> 前半と後半の計算は独立しているので高速化されると書いてあります。
もし本当にそんな事が書いてあるなら捨てちゃいましょう。
前半と後半の計算は独立してますが、片方ずつ実行されますので
高速化はされません。
CPUが複数あるとき、独立した計算を別のスレッドで実行することで、
高速化することも可能ですが、このプログラムはそのようなことは
行っていないです。
再帰の呼び出しのたびにスレッドを作るというのもナンセンス。
スレッド作成のオーバーヘッドが大きすぎます。
> というように、再起処理を行わずにもっと簡単にできてしまうからです。
> 問題が悪いだけ、という可能性ももちろんありますが
再帰関数の良い問題というのが難しいのでしょう。
・再帰を使う必要性がある
・初心者にも理解しやすい
「ハノイの塔」なんかが良い問題の題材になりうると思うのですが。
> 前半と後半の計算は独立しているので高速化されると書いてあります。
もし本当にそんな事が書いてあるなら捨てちゃいましょう。
前半と後半の計算は独立してますが、片方ずつ実行されますので
高速化はされません。
CPUが複数あるとき、独立した計算を別のスレッドで実行することで、
高速化することも可能ですが、このプログラムはそのようなことは
行っていないです。
再帰の呼び出しのたびにスレッドを作るというのもナンセンス。
スレッド作成のオーバーヘッドが大きすぎます。
> というように、再起処理を行わずにもっと簡単にできてしまうからです。
> 問題が悪いだけ、という可能性ももちろんありますが
再帰関数の良い問題というのが難しいのでしょう。
・再帰を使う必要性がある
・初心者にも理解しやすい
「ハノイの塔」なんかが良い問題の題材になりうると思うのですが。