今天学习了C语言的递归调用,跟大家分享下心得
例一:编写一个函数实现n^k,使用递归实现
我第一次编写的代码如下(其实是抄的)
int my_pow(int n, int k)     
{
int sum;
if (k == 0)
{
sum = 1;
}
else
{
sum = n*my_pow(n, k - 1);
}
return sum;
}


    然后我仔细研究发现,可以不需要else语句,用if语句可以更简洁的写出以下代码,修改后如下:

int my_pow(int n, int k)     
{
int sum=1;
if (k)//千万不能用while
{
sum = n*my_pow(n, k - 1);
}
return sum;
}

    直接把sum初始化为1,当k=0时跳出循环返回1,然后从里到外层层返回,值得注意的是,这样的代码是不能够用while循环的,这样会造成死循环,因为while是循环语句,if是判断语句,入栈的时候k的值会改变,会影响到while的循环次数,这样周而复始= =。害得朕调试了许久。。。


例二:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

    有了上边的经验,这就简单了许多一气呵成,其实写起来还真不是那么回事,我一般是先写在修改

第一次是这样的

int unsigned plus_(unsigned num)
{
int sum=0;
if (num<10)
{
sum = num;
}
else if((num/10)> 0)
{
sum = num % 10 + plus_(num / 10);
}
return sum;
}

    然而洗了个头回来看,我有病啊!!!因为第一个是抄的,然后惯性思路既用了num/10判定条件,然后搞得头一位必许单独输出,修改如下:

int unsigned plus_(unsigned num)
{
int sum=0;
    if(num)
{
sum = num % 10 + plus_(num / 10);
}
return sum;
}
    之后被分析,说这样并没有体现出递归的限制条件,自己想想也对于是就改为:
    1.
    int my_pow(int n, int k)     
{
	if (k)
	{
		return n*my_pow(n, k - 1);
	}
	else
		return 1;
	
}
    2.
    int unsigned plus_(unsigned num)
{

	if (num)
	{
		return num % 10 + plus_(num / 10);
	}
	else
		return 0;
}

例三:

编写一个函数reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列。

要求:不能使用C函数库中的字符串操作函数。

    这个函数实现主要分为两部分,因为不能调用库函数,所以要用长度计数器,然后再用递归实现翻转

    如下

char* reverse_string(char * p)
{
assert(p);
int n = 0;
char temp;
char *q;
q = p;
while (*p != '\0')//模拟实现strlen函数
{
n++;
p++;
}
if (n > 1)
{
temp = q[0];
q[0] = q[n - 1];
q[n - 1] = '\0';
reverse_string(q + 1);
q[n - 1] = temp;
}
return q;
}

    经过自己的研究,意识到递归必须对函数本身有限制,最好用if,用while可能会造成死循环。其他的就是递归调用本就是函数调用其本身。用从最内层调用想起,比如一个猴子一天班一个玉米,50个玉米要用几天搬完,我们就要这样想,当他还剩一个搬完时已经搬了49个,然后往前推,这才是递归的本质。

如有不足之处,希望批评指正