c# int[] и рекурсия.. как?
От: nt2000  
Дата: 04.09.19 21:51
Оценка:
Нужно пробежаться по элементам. Как это можно сделать? в параметр можно послать только сам массив.
Извращался превращением на лету в строку потом субстринг(1) и обратьно в целые и вроде получается но не нравится принимающей стороне.. как можно отсекать у массива по одному элементу?
Re: c# int[] и рекурсия.. как?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 04.09.19 22:03
Оценка:
Здравствуйте, nt2000, Вы писали:

N>как можно отсекать у массива по одному элементу?

Отсекать никак. Вместо отсекать — создать новый и скопировать в него хвост. Будет лучше, чем со строками, но так себе все равно решение. Проще всего было бы передать индекс.
Re: c# int[] и рекурсия.. как?
От: kov_serg Россия  
Дата: 04.09.19 22:04
Оценка:
Здравствуйте, nt2000, Вы писали:

N>Нужно пробежаться по элементам. Как это можно сделать? в параметр можно послать только сам массив.

  void walk(int[] data) {
    for(int i=0;i<data.Length;++i) touch(data[i]);
  }

N>Извращался превращением на лету в строку потом субстринг(1) и обратьно в целые и вроде получается но не нравится принимающей стороне.. как можно отсекать у массива по одному элементу?
public class A {
  public int[] data;
  public void fn(int h,int t) {
    if (h>=t) return;
    int m=(h+t)/2;
    touch(data[m]);
    fn(h,m-1); fn(m+1,t);
  }
}
void fn(int[] data) {
   var a=new A() { data=data };
   a.fn(0,data.Length);
}
Re[2]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 04.09.19 22:19
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, nt2000, Вы писали:


N>>Нужно пробежаться по элементам. Как это можно сделать? в параметр можно послать только сам массив.

_>
_>  void walk(int[] data) {
_>    for(int i=0;i<data.Length;++i) touch(data[i]);
_>  }
_>

N>>Извращался превращением на лету в строку потом субстринг(1) и обратьно в целые и вроде получается но не нравится принимающей стороне.. как можно отсекать у массива по одному элементу?
_>
_>public class A {
_>  public int[] data;
_>  public void fn(int h,int t) {
_>    if (h>=t) return;
_>    int m=(h+t)/2;
_>    touch(data[m]);
_>    fn(h,m-1); fn(m+1,t);
_>  }
_>}
_>void fn(int[] data) {
_>   var a=new A() { data=data };
_>   a.fn(0,data.Length);
_>}
_>



к сожалению так нельзя. никаких фор, никаких новых(дополнительных) структур, голая рекурсия
надо перебрать при помочи самовызовов. можно создать вспомогательные методы но с теми же ограничениями.
И Linqи и другие навороты нельзя использовать. Вот что есть в System тем и пользуйся
Re: c# int[] и рекурсия.. как?
От: Mystic Artifact  
Дата: 04.09.19 22:20
Оценка: +7
Здравствуйте, nt2000, Вы писали:

    private static void Do(Span<int> arr) {
        if (arr.Length == 0) return;
        Console.WriteLine(arr[0]);
        Do(arr.Slice(1, arr.Length - 1));
    }

    private static void Main() {
        var x = new int[] { 1, 2, 3, 4, 5 };
        Do(x);
    }


PS: Но правильным ответом, конечно же, является засунуть эту задачку в то место откуда она вылезла.
Отредактировано 04.09.2019 22:23 Mystic Artifact . Предыдущая версия . Еще …
Отредактировано 04.09.2019 22:21 Mystic Artifact . Предыдущая версия .
Re[2]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 04.09.19 23:30
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

Всё работает но они капризничают... Уже не знаю делать.. И не пишут что конкретно не так..

Your code did not compile. Please read and correct the errors below.

Error emitted from internal testing code. This error is occurring when our internal testing code is trying to call your code. It may mean that you have the wrong header for your solution, or a mismatched { } ( ) brace.
The best overloaded method match for '.DoCnt(int[], int[])' has some invalid arguments

Что за точка интересно перед названием метода? У меня нет никакой точки..
Вот они что хотят:

Constraints: Your method must be recursive and not use any loops (for, while, etc.). You may not use a string, array, or any data structure (stack, map, set, etc.) other than the lists passed. When your code is done running, the two lists should have the same contents as when the call began. Either do not modify the lists, or if you do modify them, restore them to their original state afterward. You may not declare any additional data structures. Your solution should run in no worse than O(N) time, where N is the number of elements in the lists.

Re[3]: c# int[] и рекурсия.. как?
От: Mystic Artifact  
Дата: 05.09.19 00:32
Оценка:
Здравствуйте, nt2000, Вы писали:

А язык точно C#?

Плюс задача то какая? Откуда второй "список"?

ADD: Как возможный намёк — по приведенному тобою ограничения на реализацию — массив можно менять, но с условием, что ты его вернешь в исходное состояние. Но, без конкретного условия задачи, это так себе допущение. Да и мне, честно говоря, противна сама мысль пытаться использовать это. Всё таки, что-то мне подсказывает, что практически единственно верный правильный ответ — это засунуть им условие задачи назад, туда... в internal testing code.
Отредактировано 05.09.2019 0:58 Mystic Artifact . Предыдущая версия .
Re: c# int[] и рекурсия.. как?
От: nikda  
Дата: 05.09.19 06:58
Оценка:
using System;

namespace ArrayRecurciveWalk
{
    internal class Program
    {
        private static void f(int[] array)
        {
            if (array.Length == 0)
                return;

            Console.Write(array[array.Length - 1]);

            Array.Resize(ref array, array.Length - 1);

            f(array);
        }

        private static void ff(int[] array)
        {
            Array.Reverse(array);
            f(array);
        }


        private static void Main(string[] args)
        {
            int[] array = new int[] { 1, 2, 3 };
            Console.WriteLine(array.Length);

            f(array);

            Console.WriteLine();
            Console.WriteLine(array.Length);

            Array.ForEach(array, o => Console.Write(o));
            Console.ReadKey();
        }
    }
}
Re[3]: c# int[] и рекурсия.. как?
От: fmiracle  
Дата: 05.09.19 07:11
Оценка:
Здравствуйте, nt2000, Вы писали:

N>

N>Constraints: Your method must be recursive and not use any loops (for, while, etc.). You may not use a string, array, or any data structure (stack, map, set, etc.) other than the lists passed. When your code is done running, the two lists should have the same contents as when the call began. Either do not modify the lists, or if you do modify them, restore them to their original state afterward. You may not declare any additional data structures. Your solution should run in no worse than O(N) time, where N is the number of elements in the lists.


Конкретно эти приведенные ограничения не запрещают сделать
public void Iterate(int[] a){
  if( a.length > 0 ){
    Iterate(a, 0);
  }
}
private void Iterate(int[] a, int start); // вот этот рекурсивный


Правда непонятно почему тут два списка.
Дал бы ты полные условия задачи что ли. А то возможно там смысл вообще в другом.
Re: c# int[] и рекурсия.. как?
От: Danchik Украина  
Дата: 05.09.19 09:24
Оценка:
Здравствуйте, nt2000, Вы писали:

N>Нужно пробежаться по элементам. Как это можно сделать? в параметр можно послать только сам массив.

N>Извращался превращением на лету в строку потом субстринг(1) и обратьно в целые и вроде получается но не нравится принимающей стороне.. как можно отсекать у массива по одному элементу?

В режиме бреда:

void Walk(int[] arr)
{
    if (arr.Length > 0)
    {
        var another = new int[arr.Length - 1];
        Array.Copy(arr, 1, another, 0, another.Length);
        Walk(another);
    }
}
Re[4]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 05.09.19 09:54
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>А язык точно C#?


MA>Плюс задача то какая? Откуда второй "список"?


надо стравнить два полученных списка и подсчитать количество одинаковых элементов.
и твой способ возвращает верный ответ.. может у них глюк
static int DoCnt(Span<int>   v1,Span<int>  v2){
    int l = v2.Length > v1.Length ? v1.Length : v2.Length;
    return l < 1 ? 0 : (l > 0 && v1[0] == v2[0] ? 1 : 0) + (l > 1 ? DoCnt( v1.Slice(1, v1.Length - 1), v2.Slice(1, v2.Length - 1)) : 0);
        }

a вот я как пытался.. тоже работает
static int DoCnt(int[]v1,int[]v2){
    int l = v2.Length > v1.Length ? v1.Length : v2.Length;
    return l<1?0:(l>0&&v1[0]==v2[0]?1:0)+(l>1?DoCnt(Array.ConvertAll(string.Join(' ',v1).Substring(2).Split(), int.Parse),Array.ConvertAll(string.Join(' ',v2).Substring(2).Split(), int.Parse)):0);
}
Re[5]: c# int[] и рекурсия.. как?
От: kov_serg Россия  
Дата: 05.09.19 10:06
Оценка:
Здравствуйте, nt2000, Вы писали:

N>Здравствуйте, Mystic Artifact, Вы писали:


MA>>А язык точно C#?


MA>>Плюс задача то какая? Откуда второй "список"?


N>надо стравнить два полученных списка и подсчитать количество одинаковых элементов.

N>и твой способ возвращает верный ответ.. может у них глюк
Нет у них массив длинный и стека не хватает
N>
N>static int DoCnt(Span<int>   v1,Span<int>  v2){
N>    int l = v2.Length > v1.Length ? v1.Length : v2.Length;
N>    return l < 1 ? 0 : (l > 0 && v1[0] == v2[0] ? 1 : 0) + (l > 1 ? DoCnt( v1.Slice(1, v1.Length - 1), v2.Slice(1, v2.Length - 1)) : 0);
N>        }
N>

N>a вот я как пытался.. тоже работает
N>
N>static int DoCnt(int[]v1,int[]v2){
N>    int l = v2.Length > v1.Length ? v1.Length : v2.Length;
N>    return l<1?0:(l>0&&v1[0]==v2[0]?1:0)+(l>1?DoCnt(Array.ConvertAll(string.Join(' ',v1).Substring(2).Split(), int.Parse),Array.ConvertAll(string.Join(' ',v2).Substring(2).Split(), int.Parse)):0);
N>}
N>

Т.е. ты просто считаешь кол-во одинаковых элементов -- на кой такие извращения? BDSM программирование?
Re[4]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 05.09.19 10:11
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>Здравствуйте, nt2000, Вы писали:


N>>

N>>Constraints: Your method must be recursive and not use any loops (for, while, etc.). You may not use a string, array, or any data structure (stack, map, set, etc.) other than the lists passed. When your code is done running, the two lists should have the same contents as when the call began. Either do not modify the lists, or if you do modify them, restore them to their original state afterward. You may not declare any additional data structures. Your solution should run in no worse than O(N) time, where N is the number of elements in the lists.


F>Конкретно эти приведенные ограничения не запрещают сделать

F>
F>public void Iterate(int[] a){
F>  if( a.length > 0 ){
F>    Iterate(a, 0);
F>  }
F>}
F>private void Iterate(int[] a, int start); // вот этот рекурсивный
F>

тут появлется int start.. к сожалению...

F>Правда непонятно почему тут два списка.

F>Дал бы ты полные условия задачи что ли. А то возможно там смысл вообще в другом.

надо стравнить два полученных списка и подсчитать (и вернуть) количество одинаковых элементов.
не стал грузить вас деталями.. похожие задачи со строками проходят на ура.. пуляю в параметр субстринг(1) и отсекаются как орехи щелкаю
думал может нечто похожее и в массивах есть, трюк такой..
Re[6]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 05.09.19 10:23
Оценка:
Здравствуйте, kov_serg, Вы писали:



_>Т.е. ты просто считаешь кол-во одинаковых элементов -- на кой такие извращения? BDSM программирование?


да))) просто задачи в интернете.. это конкретно на знание самовызовов. А что такое BDSM ? Что то знакомое.. Это не ЛГЭБТЭ? или самоистязание? )
Re[5]: c# int[] и рекурсия.. как?
От: Danchik Украина  
Дата: 05.09.19 11:22
Оценка:
Здравствуйте, nt2000, Вы писали:

[Skip]

N>надо стравнить два полученных списка и подсчитать (и вернуть) количество одинаковых элементов.

N>не стал грузить вас деталями.. похожие задачи со строками проходят на ура.. пуляю в параметр субстринг(1) и отсекаются как орехи щелкаю
N>думал может нечто похожее и в массивах есть, трюк такой..

Детали лучше дай )) Какой сабстринг если тут массивы.
Re[5]: c# int[] и рекурсия.. как?
От: Mystic Artifact  
Дата: 05.09.19 11:38
Оценка:
Здравствуйте, nt2000, Вы писали:

N>тут появлется int start.. к сожалению...

И что? Почему решение не может состоять из двух методов? Это стандартный приём же ж.
Re: c# int[] и рекурсия.. как?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.09.19 11:41
Оценка: +1
Здравствуйте, nt2000, Вы писали:

N>Нужно пробежаться по элементам. Как это можно сделать? в параметр можно послать только сам массив.

N>Извращался превращением на лету в строку потом субстринг(1) и обратьно в целые и вроде получается но не нравится принимающей стороне.. как можно отсекать у массива по одному элементу?

Span? https://docs.microsoft.com/ru-ru/dotnet/api/system.span-1?view=netstandard-2.1
и солнце б утром не вставало, когда бы не было меня
Re[7]: c# int[] и рекурсия.. как?
От: kov_serg Россия  
Дата: 05.09.19 11:51
Оценка:
Здравствуйте, nt2000, Вы писали:

_>>Т.е. ты просто считаешь кол-во одинаковых элементов -- на кой такие извращения? BDSM программирование?

N>да))) просто задачи в интернете.. это конкретно на знание самовызовов. А что такое BDSM ? Что то знакомое.. Это не ЛГЭБТЭ? или самоистязание? )
Примерно так:
  18+
Отредактировано 05.09.2019 11:55 kov_serg . Предыдущая версия .
Re[6]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 05.09.19 14:08
Оценка:
Здравствуйте, Danchik, Вы писали:



D>Детали лучше дай )) Какой сабстринг если тут массивы.


нет просто сравнил как просто рекурсией по строке пройтись .. строка ведь тоже своеобразный массив..
были несколько подобных задач где вместо массива целых чисел были строки


детали такие: получаешь два массива и надо вернуть количество одинаковых индексов с одинаковыми значениями.

вроде решил при чём несколькими способами + здесь пару способов подкинули
но они не принимают:
The best overloaded method match for '.DoCnt(int[], int[])' has some invalid arguments

Your code did not compile. Please read and correct the errors below.

Error emitted from internal testing code. This error is occurring when our internal testing code is trying to call your code. If you see this, it may mean that you have the wrong header for your solution, or a mismatched { } ( ) brace.
The best overloaded method match for '.DoCnt(int[], int[])' has some invalid arguments



a требования такие:

Constraints: Your method must be recursive and not use any loops (for, while, etc.). You may not use a string, array, or any data structure (stack, map, set, etc.) other than the lists passed. When your code is done running, the two lists should have the same contents as when the call began. Either do not modify the lists, or if you do modify them, restore them to their original state afterward. Note again that you may not declare any additional data structures. Your solution should run in no worse than O(N) time, where N is the number of elements in the lists.

Re[6]: c# int[] и рекурсия.. как?
От: nt2000  
Дата: 05.09.19 14:16
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, nt2000, Вы писали:


N>>тут появлется int start.. к сожалению...

MA> И что? Почему решение не может состоять из двух методов? Это стандартный приём же ж.

согласен.. делал уже так.. наверное точно у них глюк.. потому что есть парa задач где тоже выдают ошибку что должно быть минимум 2 метода хотя там я напичкал около 5ти методов

static int DoCnt(int[] v1, int[] v2){return DoCnt1(v1,v2,(v2.Length>v1.Length?v1.Length:v2.Length)-1);} 
static int DoCnt1(int[]v1,int[]v2,int n){return n < 0?0:(v1[n]== v2[n]?1:0 )+DoCnt1(v1, v2, n - 1);}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.