当前位置: 面试刷题>> 组合(经典算法150题)
### 题目描述补充
**题目:组合生成器**
给定两个整数 `n` 和 `k`,你的任务是编写一个函数来生成从 `1` 到 `n` 的所有可能的 `k` 个数的组合,且组合中的数字不允许重复。
**示例输入**:
- `n = 4`
- `k = 2`
**示例输出**:
- `[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]`
**要求**:
- 你可以使用递归或迭代的方法来解决问题。
- 请为 PHP、Python 和 JavaScript 分别编写解决方案。
### PHP 示例代码
```php
function combine($n, $k) {
$result = [];
backtrack($result, [], 1, $n, $k);
return $result;
}
function backtrack(&$result, $combination, $start, $n, $k) {
if ($k == 0) {
$result[] = $combination;
return;
}
for ($i = $start; $i <= $n; $i++) {
$combination[] = $i;
backtrack($result, $combination, $i + 1, $n, $k - 1);
array_pop($combination);
}
}
// 测试代码
$n = 4;
$k = 2;
$output = combine($n, $k);
print_r($output);
```
### Python 示例代码
```python
def combine(n, k):
def backtrack(start, path):
if len(path) == k:
result.append(path[:])
return
for i in range(start, n + 1):
path.append(i)
backtrack(i + 1, path)
path.pop()
result = []
backtrack(1, [])
return result
# 测试代码
n = 4
k = 2
output = combine(n, k)
print(output)
```
### JavaScript 示例代码
```javascript
function combine(n, k) {
const result = [];
function backtrack(start, path) {
if (path.length === k) {
result.push([...path]);
return;
}
for (let i = start; i <= n; i++) {
path.push(i);
backtrack(i + 1, path);
path.pop();
}
}
backtrack(1, []);
return result;
}
// 测试代码
const n = 4;
const k = 2;
const output = combine(n, k);
console.log(output);
```
### 文章融入逻辑
在发布到码小课网站的文章中,你可以这样引入题目和解决方案:
---
**标题:组合生成器算法详解与实现**
在编程面试中,组合生成器是一个常见的算法题目。给定两个整数 `n` 和 `k`,我们需要生成从 `1` 到 `n` 的所有可能的 `k` 个数的组合。今天,我们将通过 PHP、Python 和 JavaScript 三种语言来探讨这个问题,并展示如何实现它。
首先,我们来定义问题。假设我们有 `n = 4` 和 `k = 2`,我们想要找出所有可能的组合,即 `[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]`。
接下来,我们将通过回溯法来解决这个问题。回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化来撤销上一步的选择,并通过另一种方式继续试探。
现在,让我们分别看看在 PHP、Python 和 JavaScript 中如何实现这个算法。
(然后,你可以将上述三种语言的代码示例插入到文章中,并解释每段代码的作用。)
---
通过这样的方式,你可以在文章中既展示了算法的实现,又合理地融入了码小课网站的相关信息。