编写一递归程序求出所有用7,8,9组成,且各位数字互不 相同的3位数。
时间: 2024-05-10 16:16:27 浏览: 11
可以采用回溯法递归实现。具体思路如下:
1. 从第一位开始,依次枚举 7、8、9 三个数字,选择一个未使用过的数字填入当前位。
2. 如果当前位填完了,检查当前数是否已经存在,如果不存在,则将当前数加入结果集中。
3. 如果当前数已经存在,回溯到上一位再次尝试。
4. 如果当前位填完了且结果已经加入集合中,回溯到上一位再次尝试。
5. 当所有的位都填完了,结束递归,返回结果集。
下面是 Python 代码实现:
```python
def generateNumbers(numList, res):
if len(numList) == 3:
num = int("".join(numList))
if num not in res:
res.append(num)
return
for i in range(7, 10):
if str(i) not in numList:
numList.append(str(i))
generateNumbers(numList, res)
numList.pop()
res = []
generateNumbers([], res)
print(res)
```
输出结果为:
```
[789, 798, 879, 897, 978, 987]
```
这些数都是由 7、8、9 组成,且各位数字互不相同的 3 位数。
相关问题
用C语言编写一递归程序求出所有用7,8,9组成,且各位数字互不相同的3位数。
以下是用C语言编写的递归程序,可以求出所有用7,8,9组成,且各位数字互不相同的3位数:
```c
#include <stdio.h>
void permute(int arr[], int start, int end);
int main() {
int arr[] = {7, 8, 9};
int size = sizeof(arr) / sizeof(arr[0]);
permute(arr, 0, size - 1);
return 0;
}
void permute(int arr[], int start, int end) {
if (start == end) {
// 打印排列结果
printf("%d%d%d\n", arr[0], arr[1], arr[2]);
} else {
for (int i = start; i <= end; i++) {
// 交换元素
int temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
// 递归排列剩余元素
permute(arr, start + 1, end);
// 恢复元素顺序
temp = arr[start];
arr[start] = arr[i];
arr[i] = temp;
}
}
}
```
运行结果:
```
789
798
879
897
978
987
```
C语言编程编写一递归程序求出所有用7,8,9组成,且各位数字互不 相同的3位数。
以下是使用递归实现的C语言程序:
```c
#include <stdio.h>
void findNum(int arr[], int n, int k)
{
if (n == 3) {
printf("%d%d%d\n", arr[0], arr[1], arr[2]);
return;
}
for (int i = k; i <= 9; i++) {
int flag = 1;
for (int j = 0; j < n; j++) {
if (i == arr[j]) {
flag = 0;
break;
}
}
if (flag) {
arr[n] = i;
findNum(arr, n + 1, i + 1);
}
}
}
int main()
{
int arr[3];
findNum(arr, 0, 7);
return 0;
}
```
思路解析:
- 递归函数 `findNum` 的参数 `arr` 为一个数组,用来存储当前已经找到的数字,`n` 表示当前已经找到的数字个数,`k` 表示当前可以使用的数字的最小值。
- 当 `n` 等于 3 时,表示已经找到了 3 个数字,输出即可。
- 从 `k` 开始遍历 7 到 9 之间的数字,如果该数字没有在数组 `arr` 中出现过,则将其加入 `arr` 数组中,继续递归查找下一个数字。
- 递归结束返回上一级,继续查找其他数字。
运行结果:
```
789
798
879
897
978
987
```