我有以下任务:
<块引用>给出一个递归算法来填充这样的数组: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
:数组答案 0 :(得分:0)
正如您正确显示的,该函数需要一个数组 T
、要填充的区域的起始索引 k
以及任务的大小 n
,即填充。
算法可以这样描述:
<块引用>如果n
为零,则返回;
否则:
从1
到n-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
。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