6

クラスには、次の課題があります。

kオブジェクトのセットからオブジェクトを選択できる個別の方法の数を出力する C++ プログラムを作成します (とのn両方が正の整数である必要があります)。この数は次の式で与えられます。nk

C(n, k) = n!/(k! * (n - k)!)

プログラムでは、2 つの値を返す関数を使用する必要があります。最初のものを呼び出しfactorialて、 を返す必要がありn!ます。2 番目の関数を呼び出して、 と の異なる値についてプログラムを5 回テストしますcombinations(カウント制御ループ)。n!/(k! * (n - k)!).nk

私は解決策を思いつきました:

#include <iostream>
using namespace std;
int factorial(int);
int combination(int, int);

void main(void)
{
    int objects, set_number, count; 
    count = 1; 
        while(count <= 5)
        {
            cout << "Please enter in number of objects ";
            cin >> objects; 
            cout << "Please enter in the number of Sets ";
            cin >> set_number;
            count++;
        }

    cout << "The Factorial is " << factorial(set_number) << " & the combination is " << combination << endl;
    cout << endl; 
}

// Factorial 
int factorial(int set_number)
{
    int cal;
    cal = set_number * factorial(set_number - 1);
    return cal; 
}

//  Combination
int combination(int objects, int set_number)
{
    int com_total, cal_set, cal_obj, min_sum, cal_min;

    cal_set = set_number * factorial(set_number - 1);
    cal_obj = objects * factorial(objects - 1);
    
    //n!/(k! * (n - k)!)
    min_sum = set_number - objects; 
    cal_min = min_sum * factorial(min_sum- 1);
    com_total = cal_set / (cal_obj * cal_min);
    return com_total; 
}

...しかし、エラーが発生し続けます。

「'factorial' : すべての制御パスで再帰的、関数はランタイム スタック オーバーフローを引き起こします。」

誰かが私を助けることができれば、私はこれに約1時間取り組んでいて、困惑しています!

4

6 に答える 6

17

再帰関数の定義には、次の 2 つの重要な要素があります。

  • 自分自身への再帰呼び出し
  • 終了条件

終了条件が不足しているようです。どうすればfactorial()自分自身を永遠に呼ぶのをやめるでしょうか?

于 2010-10-14T19:58:52.290 に答える
2

再帰関数 (つまり、基本的には自分自身を呼び出す関数) を定義しましたが、終了条件を定義していません。factorial戻る直前に再度呼び出しているため、関数は決して終了せず、何度も何度も呼び出します。

そこにブランチを追加する必要があります。

if (set_number == 0)
{
   return 1;
}
else
   return set_number * factorial(set_number - 1);
于 2010-10-14T20:00:45.423 に答える
1

基本ケースがありません。set_number <= 1 の階乗は 1 を返す必要があります

于 2010-10-14T20:01:40.597 に答える
0

この関数は、自分自身の呼び出しを停止しないため、無限再帰になります。

int factorial(int set_number)
{
    int cal;
    cal = set_number * factorial(set_number - 1);
    return cal; 
}

これはあなたが望むものです:

int factorial(int n)
 {
  if (n<=1)
    return(1);
  else
    n=n*factorial(n-1);
    return(n);
 }
于 2010-10-14T20:01:01.417 に答える
0

あなたの階乗関数は1つで終了せず、無期限に再帰します。

int factorial(int set_number)
{
    if (set_number <= 1)
        return 1;
    return set_number * factorial(set_number - 1);
}

あなたのコーディング スタイルもかなり貧弱で、C に似ています。main の後に階乗と組み合わせを定義する必要はありません。すべての変数を先頭で宣言し、宣言と初期化を混在させませんか?

また、あなたのメイン関数は、実際には仕様が言うべきことをしていません.combination変数を初期化したり、割り当てたり、combination関数を呼び出したりすることはありません.変数はひどく名前が付けられています.

于 2010-10-14T20:02:14.980 に答える
0
int factorial(int set_number)
{   
   return set_number == 1?1:set_number * factorial(set_number - 1);
}
于 2010-10-14T20:15:00.203 に答える