怎么把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;
}
[解决办法]
其实很简单。递归的话,无非就是一次只进行一个倍数的反转。
示例:
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); }}