首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

如何把for循环改为递归

2012-02-10 
怎么把for循环改为递归?任务:编号为 1-52 张牌,正面向上,从第 2 张开始,以 2 为基数,是 2 的倍数的牌翻一

怎么把for循环改为递归?
任务:编号为 1-52 张牌,正面向上,从第 2 张开始,以 2 为基数,是 2 的倍数的牌翻
一次,直到最后一张牌;然后,从第 3 张开始,以 3 为基数,是 3 的倍数的牌翻一次,直到
最后一张牌;然后…从第 4 张开始,以 4 为基数,是 4 的倍数的牌翻一次, 直到最后一张
牌;...再依次 5 的倍数的牌翻一次,6 的,7 的 直到 以 52 为基数的 翻过,输出:这时正
面向上的牌有哪些?

  这是我写的程序:
  #include <iostream.h>
int main()
{
int data[52]; //定义数组存放1~52张牌的编号
int flag[52]; //定义数组存放牌向上、向下的标记
for(int i=1;i<=52;i++)
{
data[i-1]=i;
flag[i-1]=1; //将正面向上的牌标记为1
}
for(int j=2;j<=52;j++)
{
for(i=2;i<52;i++)
{
int r=data[i-1]%j;
if (r==0)
flag[i-1]=1-flag[i-1];
}
}
  cout<<"正面向上的牌有: ";
for(i=1;i<=52;i++)
{
if( flag[i-1]==1)
cout<<data[i-1]<<" ";
}
return 0;
}





[解决办法]
其实很简单。递归的话,无非就是一次只进行一个倍数的反转。

示例:

C/C++ code
void recusive(int cur,int *data){   if(cur == 52){       data[52] = 1-data[52];   }else{      for(int i = cur;i<=52;i+=cur){          data[i] = 1-data[i];      }      recusive(cur+1,data);    }} 

热点排行