rekurencja, tablice, zwracanie stringa

0

Stwórz funkcję string ZwrocPodzielne(int[] tab, int n, int i=0) , która zwraca jedynie liczby podzielne przez n z tablicy, w postaci tekstowej wykorzystując rekurencję, w formacie bez spacji oraz znaku przejścia do nowej linii, zgodnie z kolejnością występowania, np.: [3,4,8,6]
sam program napisałem:

static string ZwrocPodzielne(int[] tab, int n, int i = 0)
        {
            if (i == 0)
            {
                Console.Write("[");
                if (tab[i] % n == 0)
                {
                    Console.Write(tab[i] + ",");
                }
                return ZwrocPodzielne(tab, n, i + 1);
            }
            if (tab.Length == 1)
            {
                if (i == 1)
                {
                    if (tab[0] % n == 0)
                    {
                        Console.Write(tab[0]);
                        return ZwrocPodzielne(tab, n, i + 1);
                    }
                }
            }
            if (i >= tab.Length)
            {
                return "]";
            }
            if (tab[i] % n == 0)
            {

                    Console.Write(tab[i] + ",");
                    return ZwrocPodzielne(tab, n, i + 1);                                
            }
            return ZwrocPodzielne(tab, n, i + 1);
        }

ale mam problem z przecinkiem, ponieważ nie wiem jaki warunek dać, żeby przecinek na końcu nie wystąpił.

0

Masz też innego buga, dla tablicy jednoelementowej, gdy liczba jest podzielna, drukuje ją dwa razy, ale bez przecinka na końcu! :)

0

Nie widzę tam opcji edytowania to dodam tutaj:

static string ZwrocPodzielne(int[] tab, int n, int i = 0)
        {
            if (tab.Length == 0)
            {
                return "[]";
            }
            if (i == 0)
            {
                Console.Write("[");
                if (tab[i] % n == 0)
                {
                    Console.Write(tab[i] + ",");
                }
                return ZwrocPodzielne(tab, n, i + 1);
            }

            if (i >= tab.Length)
            {
                return "]";
            }
            if (tab[i] % n == 0)
            {

                    Console.Write(tab[i] + ",");
                    return ZwrocPodzielne(tab, n, i + 1);                                
            }
            return ZwrocPodzielne(tab, n, i + 1);
        }
1

@Matfizf:

UPDATE: no ok przemyślałem, powinno działać bez zaawansowanych ficzerów jak substring :D, to pierwsze z kolekcjami - rzeczywiscie moje niepotrzebne skomplikowanie było. Wszystko rozumiesz? Prosciej juz nie umiem tego zrobic :D

Twój program nie robi tego o co prosi temat zadania. Tj. nie zwraca zadanego stringa, tylko wypisuje po kawałku na konsolę, porównaj z tym:

    static string ZwrocPodzielne(int[] tab, int n, int i = 0) {
        String res = "";
        if (i < tab.Length) {
            if (tab[i] % n == 0) res += tab[i];
            String tmp = ZwrocPodzielne(tab, n, i + 1);
            res += ((res.Length > 0 && tmp.Length > 0) ? "," : "") + tmp;
        } 
        if (i == 0) res = "[" + res + "]";
        return res;
    }

wołasz sobie to np. tak potem:

using System;

public class Program {
    public static void Main()   {
        int[] tab = new int[] {1,2,3,4,5,6};
        //tab = new int[]{5};
        String res = ZwrocPodzielne(tab, 2);
        Console.Write(res);
    }

//..... itd..

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0