簡體   English   中英

遞歸方法-Java

[英]Recursive method - Java

附加信息:

芯片不支持乘法,僅支持加法。 我應該通過創建一個遞歸方法mult()來解決此問題,該方法通過將x加到自身y次來執行x和y的乘法。 它的參數是x和y,其返回值是x和y的乘積。 然后,我應該編寫方法和main()來調用它。

這是純粹的邏輯思維,但是每次嘗試思考該怎么做時我都會迷路。

我被數學困住了。.我擁有的東西不起作用,我知道數學是錯誤的,但是我對此並不擅長:

public static void mult(int x, int y) {
    x = 0;
    y = 0;
    if (y > 0) {
        for (int i = 0; i < y; i++) {
            x = x * (x * y);
            return mult(x, y);
        }
    }
}

當我聽到“遞歸”時,我希望看到兩件事:

  1. 每次使用修改后的參數調用自身的函數。
  2. 頂部的停止條件告訴函數何時停止,從而避免了無限堆棧。

那你呢 在編寫代碼之前,先用文字寫下來。

一種可能性是使用累加器,該累加器將存儲乘法的當前值。 我用???替換缺少的語句

public static void main(String []args){
        System.out.println(mult(2,5));
 }
    public static int mult(int x, int y) {
      if(???) return ???;
      else return multAcc(???,???,???);
    }

    private static int multAcc(int x, int y, int acc){
        if(???) return ???;
        else return multAcc(???, ???, ???);
    }

...通過將x加到自身y次。

您實際上可以做到這一點,而不是相乘。 哦,也許如果您沒有同時將x和y都設置為零,那么您將需要添加一些;-)

最后一件事:如果您需要遞歸解決方案,則不需要for循環。

您需要記住的是,乘法是重復的加法( 假設兩個操作數均>= 0 ),因此我們有:

  • 基本情況是y為零時
  • 如果y不為零,則將x再加一次,並從y減去1

請注意,只要y為正,它最終將具有零值。 因此,基本上我們一直將x總數相加y次; 這就是我的意思:

public static int mult(int x, int y) {
    if (y == 0)
        return 0;
    return x + mult(x, y-1);
}

相同的代碼也可以尾部遞歸的方式編寫-意思是:遞歸調用返回后無事可做,這對於某些支持所謂尾部調用優化的語言很重要:

public static int mult(int x, int y, int accumulator) {
    if (y == 0)
        return accumulator;
    return mult(x, y-1, x + accumulator);
}

上面將被調用如下,注意最后一個參數總是初始化為零:

mult(10, 5, 0)
=> 50

Java在設計上沒有TCO,因此對線性(而非樹狀)進程使用遞歸是一個非常糟糕的主意。 特別是對於此類任務,這很可能會成為您程序中的瓶頸。 使用循環代替。

哦,還是必須遞歸嗎? 看起來像是一項家庭作業。 那你自己做。

public static int mult(int x, int y) {
        if (y == 0) {
            return 0;
        }
        if (y > 0) {
            return x + mult(x, y - 1);
        } else {
            return -x + mult(x, y + 1);
        }
    }

這是解決方案

暫無
暫無

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

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