我对编程比较陌生。正如标题所示,我需要一种算法,让我可以获得变量嵌套循环的相同功能。即。
for(..)
{ for(..){
for(..){....}
.
.
}}
嵌套循环的数量将根据用户输入而变化。我想要实现的是找到所有数字的组合(10,9,8,7,6,5,4)现在我读了很多。要么我完全不了解它们(我是编程世界的新手),要么它不符合我的目的。我稍后在某些计算中需要这些组合,而不仅仅是打印所有组合。正如我所知,一种方法是使用递归。我完全不明白。我试图做一个递归函数,但失败了。这就是我想要的
10 10 10
10 10 9
10 10 8
.
.
.
4 4 4
数字可以改变(如10 10 10 10,10 10 10 9 ..)这些组合将存储在一个数组中,因为我需要它们稍后进行操作。请保持简单和评论。
首选语言为java。任何语言都可以。强烈建议使用通用算法。附:这不是作业。
感谢amit。这是工作代码
def findcombinations(array,n,sol,tt=[]):
if (n== 0):
tt.append(sol[:])
return
for x in array:
sol.append(x)
findcombinations(array,n-1,sol,tt)
del sol[-1]
return tt
调用函数使用
print(findcombinations([1,2],3,[]))
答案 0 :(得分:3)
通常当您需要“动态循环”时 - 它强烈表明您确实需要recursion。
例如,找到数组[伪代码]中数字大小n
的所有可能组合:
findCombinations(array,n,sol):
if (sol.size == n): //stop condition for the recursion
print sol
return
for each x in array:
sol.append(x)
findCombinations(array,n-1,sol) //recursive call
sol.removeLast() //cleaning up environment
以上伪代码将查找并打印由n
的元素组成的所有长度为array
的序列[每个元素可以出现一次以上]
答案 1 :(得分:3)
所以你有一个或多个(好的,可能是三个或更多)数字,应该能够在4到10之间?这样做的一种方法是使用一个简单的计数器和一个函数将计数器变成一组数字。
在伪代码中:
counter_to_array(counter, positions):
var array = new array(positions)
for 0 <= i < positions:
n = counter % 7
counter = counter // 7 # INTEGER DIVISION
array[i] = 4 + n
return array
也就是说,您的数组隐含在计数器中,您可以根据需要重新创建它。这可能不是你真正需要的东西,并且正如所写的那样,阵列会变成“4 4 4”“5 4 4”“6 4 4”...“10 10 9”“10 10 10”,但改变顺序是简单地说,改变阵列位置的顺序。
工作示例: 我们想要生成一个4元素的计数器,即第11个。
因此,第11个阵列将是[8 5 4 4]
答案 2 :(得分:1)
下面给出了使用while循环的解决方案。代码用C ++编写,需要#用于include和define语句
include <iostream>
define MAXROWS 9
define MAXVALUES 9
using namespace std;
char display[] = {'1','2','3','4','5','6','7','8','9'};
int main() {
int arrs[MAXROWS]; // represent the different variables in the for loops
bool status = false;
for (int r=0;r<MAXROWS;r++)
arrs[r] = 0; // Initialize values
while (!status) {
int total = 0;
// calculate total for exit condition
for (int r=0;r<MAXROWS;r++)
total +=arrs[r];
// test for exit condition
if (total == (MAXVALUES-1)*MAXROWS)
status = true;
// printing
for (int r=0;r<MAXROWS;r++)
cout << display[arrs[r]]; // print(arrs[r])
cout << endl; // print(endline)
// increment loop variables
bool change = true;
int r = MAXROWS-1; // start from innermost loop
while (change && r>=0) {
// increment the innermost variable and check if spill overs
if (++arrs[r] > MAXVALUES-1) {
arrs[r] = 0; // reintialize loop variable
// Change the upper variable by one
// We need to increment the immediate upper level loop by one
change = true;
}
else
change = false; // Stop as there the upper levels of the loop are unaffected
// We can perform any inner loop calculation here arrs[r]
r=r-1; // move to upper level of the loop
}
}
[链接] http://www.codeproject.com/Tips/759707/Generating-dynamically-nested-loops 它显示了如何在不使用递归的情况下将简单的多个嵌套循环转换为动态循环。