2017-10-21 29 views
-2

我正在嘗試編寫一個遞歸程序,它將接收用戶輸入的數字,然後讓程序能夠計算整數的所有數字的乘積。我已經計算出我希望程序運行的方式,但是我無法計算出如何運行我的循環來計算所有數字的乘積。我發現你可以用c語言來做這件事,用num%10來檢索num的最後一個數字,num/10從整數的末尾一次一個地刪去一個數字。我只是無法弄清楚如何在C#中實現這一點,以及if/else結構應該如何。整數C的所有數字的乘積#

以下是我爲程序編寫的代碼,已經爲寫入if/else語句的代碼編寫了一部分。如果有人能夠指出我如何實現這一目標的正確方向,那將不勝感激。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using static System.Console; 

namespace _3 
{ 
class Tester 
{ 
    public static void Main(string[] args) 
    { 
     int length; 
     Write("Enter a number: "); 
     string num = Console.ReadLine(); 
     length = num.Length; 
     int productofnum = Int32.Parse(num); 
     productofnum = CalcProduct(productofnum); 
     WriteLine("The product of all digits of the number {0} is {1}.",num, productofnum); 
    } 
    public static int CalcProduct(int num) 
    { 
     int length = num.ToString().Length; 
     if (length == 0) 
     { 

     } 
     else 
     { 
     } 
     return num; 
    } 
} 
} 

回答

1

那麼首先當使用遞歸函數時,你不應該在裏面有任何循環。

你幾乎正確構建方法的結構,但它需要一點變化:

public static int CalcProduct(int num) 
{ 
    int length = num.ToString().Length; 
    if (length == 1) 
    { 
     return num; 
    } 
    return (num % 10) * CalcProduct(num/10); 
} 

說明:

當使用遞歸函數通常需要調用你正在使用的功能返回 - 所以它會遞歸閱讀更多在Recursive methods using C#

+0

偉大的作品我怎麼想! 關於遞歸,coud我只是問,有人告訴我,遞歸中需要循環,因爲if(是「Base Case」)和else(遞歸情況)必須使基本情況成立,例如這是一個例子,我發現它的最簡單的遞歸形式: https://paste.ofcode.org/k6LNEqJNBGVm6k9uZxxEVU 微軟在遞歸,我認爲是說,我上面說的是真的。 https://msdn.microsoft.com/en-us/library/z3dk2cc3(v=vs.100).aspx#使用遞歸 您的答案可以像文章描述的那樣進行嗎? –

+0

首先,我認爲這是寫作難的部分,其他所有內容都是必要的,但它們不是您的主要問題。第二個通知,SO不是一個網站,所以人們會解決你的家庭作業(這就是爲什麼你有2票反對)。現在你能夠並且應該繼續自己。 – Yonlif

1

建立在Yonlif的回答之上:如果你希望你的程序也能夠使用負數,不要忘記在使用div和mod之前使用Math.Abs​​(num)。事情是這樣的:

public static int CalcProduct(int num) 
{ 
    int _num=Math.Abs(num); 
    int length = _num.ToString().Length; 
    if (length == 1) 
    { 
     return _num; 
    } 
    return (_num % 10) * CalcProduct(_num/10); 
} 

而且,這裏是尾遞歸方法,你應該更喜歡它:

private static int CalcProductTailRecHelper(int num, int res) 
{ 
    int length = num.ToString().Length; 
    if (length == 1) 
    { 
     return res; 
    } 
    return CalcProductTailRecHelper(num/10, res*(num % 10)); 
} 

private static int CalcProductTailRec(int num){ 
    CalcProductTailRecHelper(Math.Abs(num), 1) 
} 
+0

謝謝,你說得對,當我寫答案時我忘記了。 – Yonlif