qilima888333 2015-04-30 11:02 采纳率: 100%
浏览 2959
已采纳

用递归能实现一个数组划分的算法么?

用递归能实现一个数组划分的算法么?

给一个数组,长度为m,划分成n个子数组(每个数组起码有一个元素),比如
{1 2 3 4 5}划分成2个:
1, 2345 12,345 123,45 1234,5一共5个分法
{1234}分成3个
1,2,34 1,23,4 12,3,4,一共3个分法
求代码怎么写

  • 写回答

1条回答 默认 最新

  • threenewbee 2015-04-30 11:07
    关注
     IEnumerable<IEnumerable<IEnumerable<int>>> Split(IEnumerable<int> source, int n)
    {
      int[] splitter = Enumerable.Range(1, n - 1).ToArray();
      splitter[n - 2]--;
      int[] lastsp = Enumerable.Range(source.Count() - n, n -1).ToArray();
      while (splitter.Zip(lastsp, (x, y) => x != y).Any(x => x == true))
      {
        for (int i = n - 2; i >= 0; i--)
        {
          if (splitter[i] < lastsp[i])
          {
            splitter[i]++;
            for (int j = i + 1; j < n - 1; j++)
            {
              splitter[j] = splitter[i] + j - i;
            }
            break;
          }
        }
        IEnumerable<int>[] result = new IEnumerable<int>[n];
        int acc = 0;
        for (int i = 0; i < n; i++)
        {
          if (i == n - 1)
          {
            result[i] = source.Skip(acc);
          }
          else
          {
            result[i] = source.Skip(acc).Take(splitter[i] - acc);
            acc = splitter[i];
          }
        }
        yield return result;
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同