分析程序流程

baige168 2003-06-25 06:59:02
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见下图
写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数。

┮┮┮┬┬┬┬┬┬┬
      ┴┴┴┴┴┴┴┴┴┴
│┄ n-m ┄│┄m┄│
□□□□□□■■■
■■■□□□□□□
源程序:
#include<stdio.h>
void move(int ,int ,int);
void move(int array[20],int n,int m)
{int *p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p--)
*p=*(p-1);
*array=array_end;
m--;
if(m>0)move(array,n,m);//递归调用,当循环次数m减至0时,停止调用
}
void main()
{
int number[20],n,m,i;
printf("how many numbers?");
scanf("%d",&n);
printf("input %d numbers:\n",n);
for(i=0;i<n;i++)
scanf("%d",&number[i]);
printf("how many place you want to move?");
scanf("%d",&m);
move(number,n,m);//调用move函数
printf("now,they are:\n");
for(i=0;i<n;i++)
printf("%d ",number[i]);
}
但我不清楚move函数是怎样递归调用的,里面的流程是怎样的
请大家帮详细的讲解一下,迷惑中------ (最后弄个流程图更直观)
...全文
38 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qhl932817 2003-06-25
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
using namespace std;

void f(int* p, int n, int m)
{
int* tmp = new int[m];
memmove(tmp, p+n-m, m*sizeof(int));
memmove(p+m, p, (n-m)*sizeof(int));
memmove(p, tmp, m*sizeof(int));
delete []tmp;
}

int main()
{
int a[] = {1,3,5,7,9,11,13,15,17,19};
int size = sizeof(a)/sizeof(a[0]);
for(int i=0; i<size; ++i)
cout << a[i] << ' ';
cout << endl;

f(a, size, 3);
for(int i=0; i<size; ++i)
cout << a[i] << ' ';
cout << endl;
}
njuhuangmy 2003-06-25
  • 打赏
  • 举报
回复
还是 用 两个 简单 啊

而且 好看

不过,就 失去了 锻炼得 意义 啦

除了 在 算法 上 用 递归

还可以 拿 链表 来实现啊

也是一个 学习 得 机会
积木 2003-06-25
  • 打赏
  • 举报
回复
en 以空间换时间,不过都一样
视具体情况而定
zcd_jimy 2003-06-25
  • 打赏
  • 举报
回复
这样太慢了。
新分配一个数组arrayNew[20], arrayNew[i] = array[(i + m) % n],岂不痛快?
积木 2003-06-25
  • 打赏
  • 举报
回复
void move(int array[20],int n,int m)
{
int *p,array_end;
array_end=*(array+n-1);//让array_end为数组末端的值,用于交换
for(p=array+n-1;p>array;p--)//将后面的数都向前提
*p=*(p-1);
*array=array_end;//将数组头放在最后,这样就完成了一次交换
//第一个元素挪倒了最后
m--;//已经挪了一次,所以m--
if(m>0)move(array,n,m);//递归调用,当循环次数m减至0时,停止调用
}
大致的移动是这个样子,每次都将数组头元素移动倒数组尾
a[0] a[1] a[2] a[3] a[4] a[5] a[6]

a[1] a[2] a[3] a[4] a[5] a[6] a[0] 第一次

a[2] a[3] a[4] a[5] a[6] a[0] a[1] 第二次
……

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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