#include<stdio.h>
#include<stdlib.h> int main(){
setbuf(stdout,NULL);
int move(int,int);
int value,n;
int result; printf("Input the value:\n");
scanf("%x",&value); printf("How to move?\n");
scanf("%d",&n); result=move(value,n);
printf("after moved:\n%x\n",result); return ;
} int move(int value,int n){
int t;
if(n>)
{
t=(value&)<<;
value=(value>>)|t;
n--;
value=move(value,n);
}
else if(n<)
{
t=(value&0x80000000)>>;
value=value<<|t;
n++;
value=move(value,n);
}
return value;
}
第一次自己写递归调用的函数,结果还是比较满意的
每次调用move循环左移或者右移1位,n=0时,停止递归调用
参考答案后,可改进的地方有
26 t=value<<31; 直接左移31位,不需要将前面的二进制位清零后再左移,多此一举。
33 t=value>>31; 道理同上。
写博的过程中,我又想改进一下:
#include<stdio.h>
#include<stdlib.h> int main(){
setbuf(stdout,NULL);
int move(int,int);
int value,n;
int result; printf("Input the value:\n");
scanf("%x",&value); printf("How to move?\n");
scanf("%d",&n); result=move(value,n);
printf("after moved:\n%x\n",result); return ;
} int move(int value,int n){
int t;
if(n>)
{
t=value<<;
value=(value>>)|t;
n--;
}
else if(n<)
{
t=value>>;
value=value<<|t;
n++;
} if(n!=)
value=move(value,n);
return value;
}
这样写的话,停止递归调用的条件比较明显,程序易读