簡體   English   中英

實現階乘函數時,“在所有控制路徑上遞歸”錯誤

[英]“Recursive on All Control Paths” error when implementing factorial function

對於上課我有一個任務:

編寫一個C ++程序,它將輸出一些不同的方法,你可以從一組n對象中選擇k n對象( nk都應該是正整數)。 該數字由以下公式給出:

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

您的程序應該使用兩個值返回函數。 第一個應該被稱為factorial ,應該返回n! 第二個函數應該被稱為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':在所有控制路徑上遞歸,函數將導致運行時堆棧溢出;”

如果有人可以幫助我,我已經在這個工作了大約一個小時,我很難過!

遞歸函數定義有兩個關鍵元素:

  • 對自身的遞歸調用
  • 終止條件

您似乎錯過了終止條件。 factorial()將如何退出自己永遠?

您定義了一個遞歸函數(即基本上是一個調用自身的函數),但您還沒有定義退出條件。 你在返回之前再次調用factorial ,所以函數永遠不會結束,一遍又一遍地調用自己。

你需要在那里添加一個分支,即

if (set_number == 0)
{
   return 1;
}
else
   return set_number * factorial(set_number - 1);

你錯過了一個基本案例。 因為set_number <= 1,因此應該返回1

此函數將導致不定式遞歸,因為它永遠不會停止調用自身:

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);
 }

你的階乘函數不會在一個函數上終止,它只是無限地遞歸。

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

你的編碼風格也很差,看起來很像C。 在main之后不需要定義階乘和組合,並且您在頂部聲明所有變量,沒有聲明和初始化混合?

此外,您的主要功能實際上並沒有按照規范所說的那樣做 - 您從未初始化或分配給組合變量,也沒有調用組合函數,您的變量非常命名等等。但這是您的作業,而不是我的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM