当前位置:编程学习 > C/C++ >>

求此C++程序原理

#include<iostream.h>
void fun(int );
void main()
{
 fun(10);
 cout<<endl;
}
void fun(int a)
{
 char ch;
 if(a<=1){
  cin>>ch;
  cout<<ch;
 }
 else{
  cin>>ch;
  fun(a-1);
  cout<<ch;
 }
}

 

输入 abcdefghij

输出 jihgfedcba

 

难以理解,求教高手

答案:第一个fun函数读入输入的字符串abcdefghij的第一个字符a,此时n=10大于1 递归调用第二个fun函数
第二个fun函数读入第二个字符b,此时n=9大于1 递归调用第三个fun函数
。。以此类推
第九个fun函数读入第九个字符i,此时n=2大于1 递归调用第十个fun函数
第十个fun函数读入第十个字符j,此时n=1,直接输出第十个字符j,返回调用它的第九个fun函数
第九个fun函数输出第九个字符i,返回调用它的第八个fun函数
。。逐级返回上层
最后最开始的那个fun输出第一个字符a
这样输出就是倒叙了。。
不过此函数没有引用std名字空间 所以cin cout前面必须加std::否则应该不能编译
可以直接改为
#include<iostream>
using namespace std;

int main()
{
   char a[11],*p;
   cin>>a;
   for(p=a+strlen(a)-1;p>=a;p--)cout<<*p;
   return 0;
}
思路,用char来接收一个字符,并且倒序输出这里使用了嵌套循环,效果是每层嵌套循环时都接收1个输入的字符,并在退出嵌套式从最后一次输入的字符开始输出,把ch理解为一个字符串就清楚了
void fun(int a)——接收一个int型数字char ch;——建立一个字符变量然后是if判断10是否小于或等于1 if(a<=1){——结果为假,执行else——注意,程序执行到这里之后,没有执行if内部的命令,而是执行else的内容else{cin>>ch;——输入a,这时ch的值为‘a‘
  fun(a-1);——再次进入fun,这里10-1为9  cout<<ch;————这里要注意,这条并没有被执行就进入递归了,因此,只有在跳出递归之后才会被执行,现在标记这行为AAAAA--------------------第1次嵌套-------------------a为9,ch为a------------------------
程序回跳到void fun(int a)继续执行if(a<=1){判断——a为9,结果依旧为假,执行elsecin>>ch;——输入b,这时ch的值为‘ab‘  fun(a-1);再次进入fun,这里9-1为8
程序回跳到void fun(int a)继续执行if(a<=1){判断——a为8,结果依旧为假,执行else程序回跳到void fun(int a)--------------------第2次嵌套-------------------a为8,ch为ab------------------------继续执行if(a<=1){判断——a为8,结果依旧为假,执行elsecin>>ch;——输入c,这时ch的值为‘abc‘  fun(a-1);再次进入fun,这里9-1为7--------------------第3次嵌套-------------------a为7,ch为abc------------------------继续执行if(a<=1){判断——a为7,结果依旧为假,执行elsecin>>ch;——输入d,这时ch的值为‘abcd‘  fun(a-1);再次进入fun,这里7-1为6
……略
--------------------第9次嵌套-------------------a为1,ch为abcdegfhi------------------------继续执行if(a<=1){判断——a为8,结果依旧为假,执行elsecin>>ch;——输入j,这时ch的值为‘abcdegfhij‘  fun(a-1);——再次进入fun,这里1-1为0,结果为真  cout<<ch;——这时输出是fun(1)时输入的j<<ch;这是ch的值为abcdegfhij-------------第1次退出-------------------a为0,不再发生变化,ch为abcdegfhi----------------------第2次退出-------------------a为0,不再发生变化,ch为abcdegfh-----------------------第9次退出-------------------a为0,不再发生变化,ch为a----------最后,跳出整个递归,回到最开始的else里,也就是标记的AAAAA这一行cout<<ch;——输出最后一个字符a然后方法执行完毕,回到main中执行cout<<endl;
算是跌代,就是一直重复调用fun函数,输出的话就会从尾输到头;还是举个例子容易点,当a=3时,fun函数会跳到else语句,接受一个字符a后,会调用fun(a-1)也就是fun(2);继续再接收一个字符b,又会调用到fun(1),此时进入if语句,接收到一个字符c后,输出就是从fun(1)开始,也就是先c再b,a。

函数的递归调用

Fun里有一句 fun(a-1);

所以fun(10)会要求输入一个字符,接着调用fun(9),然后才输出这个字符

而fun(10)输入的那个字符现在还没有输出,然后fun(9)调用fun(8),继续下去直到fun(1),fun(1)时会直接输出这个字符,然后返回fun(2),输出fun(2)时输入的字符,继续下去直到输出fun(10)输入的字符,完成了字符的倒序输出。

 

递归调用了fun函数,递归太多不好讲解,我们以2位字符来说明,原理一样。假设main函数中为fun(2),那么fun(int a)中,参数a就是2,这是第一次进入fun函数,当然a是大于1的,所以进入else,输入字符a,放在变量ch,中else中再次调用fund函数,这是第二次进入fun函数(重点:这里记住入口是从else中进入的,当从这个函数出来以后,会接着往else的下面一句执行),第二次进入fun函数,传的参数是a-1,那么就是1了,这时就会进入if里面,输入b,然后输出b,第二次进入函数就结束了,然后出来以后,程序接着上一次else进入的地方,往下执行,输出第一次输入的a,这样输入的字符就倒置了。

上一个:c++的指针问题
下一个:怎么学习C++语言.

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,