[讨论]关于N层循环写成递归的问题

cnhgj 2006-10-21 04:30:39
for (int i = 0; i < 10; ++i)
for (int j = i + 1; j < 10; ++j)
for (int k = j + 1; k < 10; ++k)
cout<<i<<j<<k<<endl;

像这种多层循环,如何写成递归函数?先不考虑效率问题
这里是3层,但是如果N层的话,递归还有个栈溢出的限制,不用递归的话,该如何弄?

...全文
2115 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
laifangsong 2006-10-25
  • 打赏
  • 举报
回复
<%

OutputJoin3 "", 1, 1


'递归输出3个数字结合
Sub OutputJoin3(s, num, count)
If count > 3 Then
Exit Sub
End If

Dim i, t
For i = num To 9
t = s '将值保存

s = s & i
If count = 3 Then
Response.Write s & "<br>"
End If
OutputJoin3 s, i+1, count+1

s = t '还原值
Next
End Sub

%>
亮灯了 2006-10-24
  • 打赏
  • 举报
回复
学习!
cnhgj 2006-10-22
  • 打赏
  • 举报
回复
void loop(char *arr[], int depth)
{
for (int i = 0; i < (int)strlen(arr[depth]); ++i)
{
loopNum[depth] = arr[depth][i];
cout<<loopNum[depth]<<","<<depth<<endl;
if (arr[depth+1] == NULL) //满足N层,则输出
{
for(int j = 0; j <= depth; ++j)
cout<<loopNum[j];
cout<<endl;
co++;
}
else
{
loop(arr, depth+1);
}
}
}
参考了xiao_potato跟jixingzhong的代码,最后终于找到了规律,呵呵。结贴
cnhgj 2006-10-22
  • 打赏
  • 举报
回复
第一个100分先分配
xiao_potato 30分
lexchou 30分
SammyLan 30分
Kusk 10分
cnhgj 2006-10-22
  • 打赏
  • 举报
回复
前面我可能没表达清楚,前面的告一段落。
另外再加100分,处理我下面的
char *str1 = "ABC";
char *str2 = "ABC";
char *str3 = "AB";
for (int i = 0; i < (int)strlen(str1); ++i)
for (int j = 0; j < (int)strlen(str2); ++j)
for (int k = 0; k < (int)strlen(str3); ++k)
cout<<str1[i]<<str2[j]<<str3[k]<<endl;


我的本意是写个通用的函数来处理,无论是k = j + 1还是k = 0,加一个标识来识别就行。
str1,str2,str3的值可以不一样。
mathe 2006-10-22
  • 打赏
  • 举报
回复
查看算法版的帖子:
可以有很高效率的解决方案,不需要递归:
http://community.csdn.net/Expert/topic/4946/4946900.xml?temp=.6301233
anrui32 2006-10-22
  • 打赏
  • 举报
回复
jixingzhong 2006-10-22
  • 打赏
  • 举报
回复
for (int i = 0; i < (int)strlen(str1); ++i)
for (int j = 0; j < (int)strlen(str2); ++j)
for (int k = 0; k < (int)strlen(str3); ++k)
cout<<str1[i]<<str2[j]<<str3[k]<<endl;

这样的输出,
似乎也就只能这么处理了 ~~~
jixingzhong 2006-10-22
  • 打赏
  • 举报
回复
改一下:
char *arr[4] = {str1, str2, str3, NULL}; //NULL 元素做结束标记
==》
char *arr[] = {str1, str2, str3, NULL}; //NULL 元素做结束标记

数组元素不一定是4个,
自动确定数组元素长度就可以了。

或者直接这样:
char *arr[] = {"ABC", "abc", "123", "+-*", NULL}; //NULL 元素做结束标记
也是可以的
jixingzhong 2006-10-22
  • 打赏
  • 举报
回复
整了一个 ,
按你的要求,
用递归 :


char buf[256]={0}; //输出缓冲
void fun_recurse(char *arr[], int index, int index_buf)
{
for (int i = 0; i < (int)strlen(arr[index]); ++i)
{
buf[index_buf]='\0'; //清除缓冲的无效部分
if(i>0 && index_buf>0)cout<<buf; //如果需要输出缓冲内容,输出它
cout<<arr[index][i]; //输出当前字符
if(arr[index+1] != NULL) //如果下一个不是 NULL 结束标记
{
buf[index_buf] = arr[index][i]; //把字符保存到 buf中
fun_recurse(arr, index+1, index_buf+1); //递归
}
else cout<<endl;
}
}

int main(void)
{
char *str1 = "ABC";
char *str2 = "abc";
char *str3 = "123";
char *arr[4] = {str1, str2, str3, NULL}; //NULL 元素做结束标记
/*
for (int i = 0; i < (int)strlen(str1); ++i)
for (int j = 0; j < (int)strlen(str2); ++j)
for (int k = 0; k < (int)strlen(str3); ++k)
cout<<str1[i]<<str2[j]<<str3[k]<<endl;
*/
fun_recurse(arr, 0, 0);
system("pause");
return 0;
}

这里特殊点, index 和 buf_index 是一样的,
但是逻辑上它们意义不一样, 所以用了两个参数。
cnhgj 2006-10-22
  • 打赏
  • 举报
回复
to jixingzhong
那针对这个问题,有什么更好的解决办法吗?
jixingzhong 2006-10-22
  • 打赏
  • 举报
回复
我觉得啊,
如果说有 10 个 20 个循环,
考虑递归也不行 ~~~

得从根上治,
把算法整整 ...
jixingzhong 2006-10-22
  • 打赏
  • 举报
回复
for (int i = 0; i < 10; ++i)
for (int j = i + 1; j < 10; ++j)
for (int k = j + 1; k < 10; ++k)
cout<<i<<j<<k<<endl;

这样循环,
需要把 cout<<i<<j<<k<<endl; 拆了 ~
在递归i 的时候,
递归 j j中还要递归k ...

汗 ~
隐患大大的有啊 ~
jixingzhong 2006-10-22
  • 打赏
  • 举报
回复
多层 循环该递归,
这个限制太多了 ........

一般循环和递归互换,
是针对的 一层循环。
Kusk 2006-10-22
  • 打赏
  • 举报
回复
回复人:cnhgj(戏子) (太极) ( 四级(中级)) 信誉:100 2006-10-21 20:39:09 得分:0
?

to lexchou(龍子龍孫)(本人已死)(有事烧纸) 的代码,
compose(10,3,output);只显示了36组结果

to Kusk(Kusk)
//for (loop[depth] = depth > 1 ? (loop[depth - 1] + 1); loop[depth] < 10; ++loop[depth]) : 0
是不是写错了?
--------------------------------
Sorry, 改得匆忙,应该是
for (loop[depth] = depth > 1 ? (loop[depth - 1] + 1) : 0; loop[depth] < 10; ++loop[depth])

见笑了。
zhanglin03130410 2006-10-22
  • 打赏
  • 举报
回复
就没看出用递归到问题上的,写明白写撒。
SammyLan 2006-10-21
  • 打赏
  • 举报
回复
戏子个JR...
浪费我不少大脑细胞(=_=)
SammyLan 2006-10-21
  • 打赏
  • 举报
回复
修正
#include <iostream>
#include<vector>
using namespace std;
void Foo(int const I,int const J,int const K){
for (int i = 0; i < I; ++i)
for (int j = i + 1; j < J; ++j)
for (int k = j + 1; k <K; ++k)
cout<<i<<j<<k<<endl;

}
void Foo(int* ver,int const N){
vector<int> temp;
temp.push_back(0);
while (!temp.empty()){
if (temp.size()==N){
int i=temp.size()-1;
while (temp[i]<ver[i])
{
for (int j=0;j<temp.size();++j){
cout<<temp[j];
}
cout<<endl;
++temp[i];
}
}
else if(temp[temp.size()-1]<ver[temp.size()-1]){
temp.push_back(temp[temp.size()-1]+1);
}
if (temp[temp.size()-1]==ver[temp.size()-1]){
temp.pop_back();
if(temp.size()>0)
++temp[temp.size()-1];
}
}
}
int main()
{
int ver[]={5,5,5,6,10};
int const N=sizeof(ver)/sizeof(ver[0]);
Foo(ver,N);
return 0;
}
cnhgj 2006-10-21
  • 打赏
  • 举报
回复
雯雯..你的运行时出错哦。
SammyLan 2006-10-21
  • 打赏
  • 举报
回复
void Foo(int* ver,int const N){
vector<int> temp;
temp.push_back(0);
while (!temp.empty()){
if (temp.size()==N){
int i=temp.size()-1;
while (temp[i]<ver[i])
{
for (int j=0;j<temp.size();++j){
cout<<temp[j];
}
cout<<endl;
++temp[i];
}
}
else if(temp[temp.size()-1]<ver[temp.size()-1]){
temp.push_back(temp[temp.size()-1]+1);
}
if (temp[temp.size()-1]==ver[temp.size()-1]){
temp.pop_back();
++temp[temp.size()-1];
}
}

}
int main()
{
int ver[]={5,5,5,6,10};
int const N=sizeof(ver)/sizeof(ver[0]);
Foo(ver,N);
return 0;
}
加载更多回复(26)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧