#include <stdio.h>
int main()
{
int i=5;
void palin(int n);
printf("请输入5个字符:");
palin(i);
printf("\n");
}
void palin(n)
int n;
{
char next;
if(n<=1) {
next=getchar();
printf("相反顺序输出结果:");
putchar(next);
} else {
next=getchar();
palin(n-1);
putchar(next);
}
}
首先你的代码有两处错误
#include <stdio.h>
int main() //这里的int指返回类型为:int,即整数类型,但是你在这个函数最 //后没有返回任何数据,所以错误
//修改方式有两种①:吧int改为void,即无返回类型
//②:在 printf("\n");后面加一句 return 0;
{
int i=5;
void palin(int n);
printf("请输入5个字符:");
palin(i);
printf("\n");
}
void palin(n) //这里palin()括号内的变量n需要定义一个类型,但是你吧它写在了下面
int n;
{
char next;
if(n<=1) {
next=getchar();
printf("相反顺序输出结果:");
putchar(next);
} else {
next=getchar();
palin(n-1);
putchar(next);
}
}
-------------------------------------------分割线-----------------------------------------
下面是正确的代码及注释
#include <stdio.h> //编译预处理
int main() //main函数声明
{
int i=5; //定义一个变量i,并赋初值5
void palin(int n); //声明palin函数,无返回值,定义整型参数n
printf("请输入5个字符:"); //输出语句,输出一句话:请输入5个字符:
palin(i); //调用palin函数
printf("\n"); //输出语句,\n代表换行,dos窗口程序走到这里光标会换行
return 0; //返回0,
}
void palin(int n){ //函数实现,{ }里的代码是函数体
char next; //定义一个char类型变量
if(n<=1) { //分支判断语句,如果n<=1就执行 { }里的代码,否则就 //执行 else { }里的代码
next=getchar(); //吧从控制台输入的字符赋值给next字符变量
printf("相反顺序输出结果:"); //输出一句话,没什么好讲的,同上
putchar(next); //吧next的值输出
} else {
next=getchar(); //吧从控制台输入的字符赋值给next字符变量
palin(n-1); //调用palin函数,注意这里是palin函数调用palin函数, //即:调用自身,在数学上这叫递归,有兴趣可以百度一下
putchar(next); //吧next的值输出
}
}
最后解释一下palin函数:
刚开始n=5, 走else,next=getchar(); 然后palin(4);还走else,next=getchar();直到n=1,走if,next=getchar(),所以next=getchar()调用了5次,吧输入在dos命令行的字符放入缓冲区,执行printf("相反顺序输出结果:"); 再然后 putchar(next); 输出字符,此时的字符是n=1时的字符,即:你输入的最后一个字符;再然后程序会回到n=2时else里剩下的putchar(next); 输出字符,此时的字符是n=2时的字符,即:你输入的倒数第二个字符;以此类推,输出5个字符。这样就完成了顺序输入,倒序输出的算法
int main(void){
int i=5;//声明变量i并初始化为5
void palin(int n);//声明函数,否则编译找不到自定义函数palin
printf("请输入5个字符:");//提示输入5个字符
palin(i);//用5调用函数palin
printf("\n");//回车是版面需要
return 0;//加上这一行,少了不行
}
void palin(int n){//自定义一个递归函数palin,这里原来的写法是1990年代的格式,
//现在过不了编译了,它和这个写等价
char next;//声明一个变量
if(n<=1){//当n<=1时执行以下至}前的代码
next=getchar();//从键盘接收一个字符赋给next
printf("相反顺序输出结果:");//提示
putchar(next);//输出刚才接收的字符
}//函数从这里的}前返回至下面的palin(n-1);后
else{//当n为5、4、3、2时执行以下至}前的语句
next=getchar();//从键盘接收一个字符
palin(n-1);//将n-1再调用palin直到n==2
putchar(next);//n==1时从上面else前的}前返回到这一句前面反复执行这一句直到n==5
}
}
递归调用不太好表述,也不太好理解,得好好琢磨……
追问比如我输入的12345,是23451,34521,45321,54321,这样的一个过程吗?递归调用在下面的函数明细里面过程实在看不懂啊,能详细阐述一下原理过程吗谢谢T0T
追答不是的。你输入12345回车,但getchar只接收一个字符。第一次调用由于n==5,所以执行else下面的语句next=getchar();接收'1'赋给next,但并不输出到屏幕上而是继续用n-1==4调用,如前一次一样把'2'赋给next(注意,上一次的next仍是'1',两次调用不在一个环境下)……这样一直到n==1时执行next=getchar();把5赋给next并接着输出5后函数返回;返回到哪里?在哪里调用的就返回到那条语句后面,由于这调用是在else后面的putchar(next);前调用的,所以就返回到putchar(next);这条语句前而执行这条语句——这时的环境是n==2的环境,也就是next==4的那个环境,所以输出的next是4;输出后函数又返回到了这条语句这里,但这个环境是n==3亦即next==3的环境……一直这样到n==5、next==1输出后返回到了主函数。
if(n<=1)这句在递归函数里是什么意思呢?我知道他是要先读后四位字符并输出,然后读第一位字符并输出,一步一步完成整个调序的,也就是第一步先变成(比如12345)23451是这个意思吗?那么下面函数明细部分的逻辑实在是看不懂啊,或者请您写一个类似的递归调用的函数明细行吗?谢谢