填充递增数组的递归算法 { 1, 2, 2, 3, 3, 3, ... }

时间:2021-01-13 11:54:56

标签: arrays algorithm recursion

我有以下任务:

<块引用>

给出一个递归算法来填充这样的数组:one 1, two 2, tree 3,four 4, ... ,n n.

例如,对于 n = 4,数组应该是这样的:

{ 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 }

我的尝试是

Function filling(T, k, n)

if (n = 0) do return 1 
else if (0 <= k) do filling (T, n - k + 1, n);
     else filling(T, k, n - 1);
     fi
fi

带有filling(T, k, n)

  • k:块 n 的起始案例,
  • n:数字,
  • T:数组

2 个答案:

答案 0 :(得分:0)

正如您正确显示的,该函数需要一个数组 T、要填充的区域的起始索引 k 以及任务的大小 n,即填充。

算法可以这样描述:

<块引用>

如果n为零,则返回;
否则:

<块引用>

1n-1执行填充,
然后附加 n 项价值 n

问题来了,最后一行应该如何知道从哪里开始添加。

一个简单的答案是:例程可能会返回填充区域后的索引:

size_t filling(int T[], size_t k, size_t n)
{
    if (n != 0)
    {
        k = filling(T, k, n - 1);
        for (size_t i = 0; i < n; i++)
            T[k + i] = n;
    }
    return k + n;
}

确保您的数组至少有 n*(n+1)/2 项长,以免溢出。

答案 1 :(得分:0)

这里你需要注意两件事:

  • 1开始的数组中要插入的位数,以及
  • 将数字插入数组时的计数(应等于数字本身)。

既然算法是用递归来实现的,那么我们应该知道递归的终止条件。

算法:

  • 在数组中插入数字。

  • 检查数组中插入的数字个数是否等于数字:

    • 如果计数 == 数字,则将计数重置为 0 并将数字增加 1
    • 如果 count < digit 转到步骤 1
  • 如果要插入数组的数字大于n,则终止递归。

在 C++ 中的实现:

#include <iostream>
#include <vector>

void filling (std::vector <int>& arr, int k, int n) {
    static int c;

    if (c >= n) {
        c = 0;
        return;
    }

    if (k <= c) {
        k = k + 1;
        arr.push_back(c + 1);
    } else {
        k = 0;
        c = c + 1;
    }

    filling (arr, k, n);
}

int main() {
    std::vector <int> arr;

    int n;

    std::cout << "Enter a number:" << std::endl;
    std::cin >> n;

    filling (arr, 0, n);

    for (const auto& x : arr) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

# ./a.out
Enter a number:
5
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 

# ./a.out
Enter a number:
10
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 

# ./a.out
Enter a number:
1
1 

# ./a.out
Enter a number:
4
1 2 2 3 3 3 4 4 4 4