首頁  >  文章  >  後端開發  >  C# 中的遞迴函數

C# 中的遞迴函數

WBOY
WBOY原創
2024-09-03 15:14:33476瀏覽

在C#中的遞歸函數中,遞歸的意思與英語中的意思相同,準確地說是重複自身。因此,函數的遞歸性質表示重複執行相同的工作。而且,是的,如果程式處理不正確,它肯定會以連續循環的方式運行程式。我們必須確保在執行這些遞歸函數時指定適當的條件,否則函數將一次又一次地呼叫自身,導致程式連續執行。下面讓我們繼續看看如何在 C# 中建立這些函數。

C# 中遞歸函數的語法

這裡的語法與C#中的基本函數語法相同。我們來看看吧。

C# 中的遞迴函數

這裡沒有特殊的語法,但我們可以觀察到函數在提供回傳結果時呼叫自身。我們在將這些參數值傳遞到遞歸函數時必須非常小心,因為顯然我們不希望程式碼不斷運行。

在上面的語法中,我們只能在 return 語句中呼叫函數。相反,我們甚至可以將遞歸函數的回傳值指派給一個變數並傳回該變數。

執行因式分解

這裡讓我們採用預設的問題陳述,因式分解,來產生遞歸函數。

代碼:

using System;
class First {
static void Main() {
int result;
result = fact(7);
Console.WriteLine("Factorial is : " + result);
}
public static int fact(int num)
{
if(num==0)
{
return 1;
}
return num*fact(num-1);
}
}

讓我們來看看一步一步的過程。

  1. 首先,我們創建了自己的參數化函數來從主函數獲取輸入值,我們要計算其階乘。
  2. 然後,我們建立了一個 if 條件來檢查給定的數字是否為零。如果數字為零,那麼我們將傳回 1 作為預設值。
  3. 否則,我們將目前數字與以數字負 1 為參數的函數相乘。
  4. 因此,這個乘法會重複進行,直到達到數字 0。預設情況下,我們將零的回傳輸出寫為 1,最終結果將乘以 1。

輸出:

C# 中的遞迴函數

現在,在程式碼中,我將把函數參數從 num - 1 替換為 num。  在這種情況下,該函數將一次又一次地呼叫自身,並且該過程將重複。

代碼:

using System;
class First {
static void Main() {
int result;
result = fact(7);
Console.WriteLine("Factorial is : " + result);
}
public static int fact(int num)
{
if(num==0)
{
return 1;
}
return num*fact(num);
}
}

輸出:

C# 中的遞迴函數

透過上面的輸出,我們可以清楚地看到堆疊溢位異常,即函數重複呼叫自身。相對於第一個程序,僅突出顯示的部分發生了變化。

以同樣的方式,我們可以將數字作為使用者輸入的值,如下所示:

代碼:

using System;
class First {
static void Main() {
int result,c;
string a;
Console.Write("Enter value for number :");
a = Console.ReadLine();
c = Convert.ToInt32(a);
result = fact(c);
Console.WriteLine("Factorial is : " + result);
}
public static int fact(int num)
{
if(num==0)
{
return 1;
}
return num*fact(num-1);
}
}

輸出:

C# 中的遞迴函數

如果我們輸入零怎麼辦?是的,一個會被退回。

輸出:

C# 中的遞迴函數

現在,如果我們給負數怎麼辦?

輸出:

C# 中的遞迴函數

這也給了我一個堆疊溢位異常,因為我們的階乘遞歸函數在每次執行時都會減少其參數值。因此,負數將繼續減少為 -6、-7、-8 等。這就是我們出現此異常的原因。

作為練習,你可以嘗試為負數建立一個遞歸函數嗎?

提示:我們可以採用小於零的數字作為前提條件,然後在遞歸函數參數中加一,直到零到來。

C# 中的遞歸函數範例

關於遞歸函數,有一些很好的例子可以引用:

我們確實還有其他一些地方可以使用這些遞歸函數。

  • 從給定的起點和終點連續列印數字。 (節目如下)
  • 從給定的起點開始添加數字,並在終點或達到特定總和時停止。
  • 列印除以任何特定範圍內的任何特定數字的數字。
  • 我們想在寫完一個句子後印出任意數量的連續線或點。

如您所觀察到的,遞歸函數類似於循環的功能,但我們重複呼叫相同的函數。

讓我們看看如何寫一個遞歸函數來連續加數字,直到程式找到作為輸入給出的第二個數字。

代碼:

using System;
class First {
static void Main() {
int result,c,d;
string a,b;
Console.Write("Enter value for 1st number :");
a = Console.ReadLine();
c = Convert.ToInt32(a);
Console.Write("Enter value for 2nd number :");
b = Console.ReadLine();
d = Convert.ToInt32(b);
result = add(c,d);
Console.WriteLine("Add is : " + result);
}
public static int add(int num1,int num2)
{
int sum ;
sum=num1;
if (num1 < num2 )
{
num1++;
sum=sum+add(num1,num2);
return sum;
}
return sum;
}
}

在這裡,我們所做的是:

  • 我們透過使用者輸入取得了兩個數字 num1 和 num2
  • Add函數,將從num1開始的數字相加,直到得到num2。

例如,如果我取 num1 = 5 和 num2 = 8,那麼我們得到的輸出總和就是 5+6+7+8,即 26。

輸出:

C# 中的遞迴函數

如果我給的 num1 小於 num2 怎麼辦?

輸出:

C# 中的遞迴函數

它首先給出一些作為 num1 值,我們將 sum 值指派給 num1 值,如果 if 語句不適用則傳回 sum。

作為練習,你可以編寫一個遞歸函數來列印“我喜歡編碼”,直到它滿足特定條件嗎?

提示:我們可以按照與上述程序中相同的添加過程進行操作。

結論

至此,我們已經成功了解了遞歸函數的執行、這些函數的呼叫方式以及一些範例。我們還了解了函數呼叫中的一個簡單差異如何導致程式運行超出其範圍並創建異常。

以上是C# 中的遞迴函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn