在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); } }
讓我們來看看一步一步的過程。
輸出:
現在,在程式碼中,我將把函數參數從 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); } }
輸出:
透過上面的輸出,我們可以清楚地看到堆疊溢位異常,即函數重複呼叫自身。相對於第一個程序,僅突出顯示的部分發生了變化。
以同樣的方式,我們可以將數字作為使用者輸入的值,如下所示:
代碼:
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); } }
輸出:
如果我們輸入零怎麼辦?是的,一個會被退回。
輸出:
現在,如果我們給負數怎麼辦?
輸出:
這也給了我一個堆疊溢位異常,因為我們的階乘遞歸函數在每次執行時都會減少其參數值。因此,負數將繼續減少為 -6、-7、-8 等。這就是我們出現此異常的原因。
作為練習,你可以嘗試為負數建立一個遞歸函數嗎?
提示:我們可以採用小於零的數字作為前提條件,然後在遞歸函數參數中加一,直到零到來。
關於遞歸函數,有一些很好的例子可以引用:
我們確實還有其他一些地方可以使用這些遞歸函數。
如您所觀察到的,遞歸函數類似於循環的功能,但我們重複呼叫相同的函數。
讓我們看看如何寫一個遞歸函數來連續加數字,直到程式找到作為輸入給出的第二個數字。
代碼:
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 = 5 和 num2 = 8,那麼我們得到的輸出總和就是 5+6+7+8,即 26。
輸出:
如果我給的 num1 小於 num2 怎麼辦?
輸出:
它首先給出一些作為 num1 值,我們將 sum 值指派給 num1 值,如果 if 語句不適用則傳回 sum。
作為練習,你可以編寫一個遞歸函數來列印“我喜歡編碼”,直到它滿足特定條件嗎?
提示:我們可以按照與上述程序中相同的添加過程進行操作。
至此,我們已經成功了解了遞歸函數的執行、這些函數的呼叫方式以及一些範例。我們還了解了函數呼叫中的一個簡單差異如何導致程式運行超出其範圍並創建異常。
以上是C# 中的遞迴函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!