簡體   English   中英

列表總和<integer>遞歸地</integer>

[英]Sum of List<Integer> recursively

各位程序員好。

我遇到了一個非常愚蠢的問題。我應該遞歸地對列表中的所有整數求和。 我知道有一種更簡單的方法可以做到這一點,而且我實際上也采用了這種方法(請參閱下面的 class)。 但是這個賦值的意思是我必須把列表分成兩半,然后遞歸地計算兩半的和,最后我只返回 half1 + half2。

問題是高級方法不返回所有值的總和。 誰能幫幫我嗎?

方法 sum 是簡單的方法。 Summer(用丹麥語總結)是更高級的方法。

package opgave1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class BinærSøgning {
    public static void main(String[] args) {
        Random random = new Random();
        int tal = 3;

        List<Integer> liste = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++)
            liste.add(random.nextInt(10));
        Collections.sort(liste);

        System.out.println(liste);
        //      System.out.println(binærSøgning(liste, 0, tal));
        System.out.println(summer(liste, 0));
    }

    public static int binærSøgning(List<Integer> liste, int start, int find) {
        if (liste.size() > 0) {
            int midt = liste.size() / 2;
            if (liste.get(midt) == find)
                return start + midt;
            else if (liste.size() > 1) {
                if (find < liste.get(midt))
                    return binærSøgning(liste.subList(0, midt), start, find);
                else
                    return binærSøgning(liste.subList(midt + 1, liste.size()), start + midt + 1, find);
            }
        }
        return -1;
    }

    public static int sum (List<Integer> list, int i)
    {
        if (i == list.size())
            return 0;
        else
            return list.get(i) + sum(list, i+1);
    }


    public static int summer(List<Integer> list, int start){
        int right = 0;
        int left = 0;

        if(start == list.size()){
            return 0;
        } else {

            int mid = list.size() / 2;
            if(start < mid){
                left += list.get(start) + summer(list.subList(0, mid), start+1);
            } else if(mid < list.size()){
                right += list.get(mid) + summer(list.subList(mid+1, list.size()), mid+1);
            }
        }
        return right + left;
    }


}

首先,如果你需要做的只是使用遞歸,你不需要將列表切成兩半。 列表元素的總和是其第一個元素的總和+列表其余部分的所有元素的總和。

其次,你的方法過於復雜。 如果列表為空,則列表元素的總和為0,唯一元素是包含1個元素,如果它包含多於1,則應用於兩個子列表的方法結果的總和。需要任何開始論證。

這應該讓你開始。

編輯:因為奧斯卡洛佩茲給了你答案,但我發現它太復雜了,這是我的:

public static int sum(List<Integer> list) {
    if (list.isEmpty()) {
        return 0;
    }
    else if (list.size() == 1) {
        return list.get(0);
    }
    else {
        int half = list.size() / 2;
        return sum(list.subList(0, half)) + sum(list.subList(half, list.size()));
    }
}

你確定要拆分清單嗎? 通常,當您完成家庭作業的任務時,其含義如下:

public static int sum(List<Integer> l,int start) {
if (start==l.size()) return 0;
return l.get(start)+sum(l,start+1);
}

當您在遞歸中發送start + 1時,您錯過了列表元素。

     left += list.get(start) + summer(list.subList(0, mid), start+1);

你應該發送

      left += list.get(0) + summer(list.subList(1, mid), 0);

      right += list.get(mid) + summer(list.subList(mid+1, list.size()), 0);

我沒有看到發送任何起始值的必要性。 每次遞歸都應該以0代替開始。

我認為可以通過跟蹤范圍的第一個和最后一個索引以更簡單的方式解決,如下所示:

public static int sum(List<Integer> list, int i, int j) {
    if (i == j)
        return list.get(i);
    int half = (i + j) / 2;
    return sum(list, i, half) + sum(list, half + 1, j);
}

它被稱為這樣:

List<Integer> list = Arrays.asList(1, 2, 3);
System.out.println(sum(list, 0, list.size()-1));

它適用於非空列表。 如果列表為空,則需要在調用sum之前進行檢查。

對於兩個基本情況,Ii更容易,如果使用子列表,則不需要額外的'start'參數。 (因為這是家庭作業,我不會填寫細節。)

public static int summer(List<Integer> list) {
   //base 1
   if (list.size() == 0) {

   }
   //base 2
   else if (list.size() == 1) {

   }
   else
   {
      //no need for if statements now!
      int left = summer(list.sublist(/* */))
      int right = summer(list.sublist(/* */))
      return left + right;
   }
}

我想知道獲得List的“一半”的原因。
該問題的解決方案是唯一的:

public int sum_list(List<Integer> list) {
    if (list == null || list.isEmpty()) {
        return 0;
    }
    return list.remove(0) + sum_list(list);
}
import java.util.*;

public class SumListByRecursion {

    public static int sumByRec(List<Integer> list) {


        int size = list.size();
        if(size > 0) {
            return list.get(0) + sumByRec(list.subList(1, size));           
        }
        return 0;
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<Integer> list = new ArrayList<Integer>();

        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

        System.out.println("List:"+" "+list);

        int sum = sumByRec(list);
        System.out.println("Sum of the list:"+" "+sum);
    }

}

您可以使用此方法對給定列表的所有元素求和。

public static Integer sumOfList(List<Integer> list){
    try {
        return list.get(0) + sumOfList(list.subList(1, list.size()));
    }catch (Exception e) {
        return 0;
    }
}

暫無
暫無

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

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