该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
研究明白了,以上递归函数原理简述:
先要明白调用函数和被调函数之间的连接和信息交换是通过栈进行。要读取到栈的数据,只能读取栈顶,栈顶以下的数据是不能访问。要想访问下面的数据只能出栈,从栈顶到栈底顺序出栈。调用被调函数就会分配内存区,主要是局部变量的分配。函数结束,就会释放存储区(也就是释放内存,避免大的浪费,因为很大的程序就需要占用大内存),程序运行是被载入内存的,内存的存取速度快过硬盘,当然硬盘也能当内存使用,销毁栈的顺序是从栈顶往下。
无论有无return语句函数都要返回。有值反值,没值返回计算结果。
上面的程序进行递归的时候需要建栈,进行分配变量n,先进栈从变量5开始,进完之后:
1 栈顶 值:10
2 12
3 14
4 16
5 栈底 18
然后rerurn c返回一次执行c=age(n-1)+2=10,多次返回是假象,只是要销毁1 2 3 4个栈也就是变量,进行释放,直到返回到栈底。过程1栈即n=1,进行销毁,此时2栈为栈顶,第一次执行的c=age(n-1)+2重新执行,因为销毁了1栈的变量所以现在要使用新变量即2栈,结果要在计算一次,c=10+2=12。接着重复,直到5栈到达栈顶,函数彻底返回。
以下的递归函数使用
//把整数以字符打印
#include
int main()
{
void binary_to_ascii (int);
int ch_number;
scanf ("%d",&ch_number);
binary_to_ascii (ch_number);
printf ("\n");
return 0;
} 思路是除以10 然后逆向打印
void binary_to_ascii (int value)
{
int quotient;
quotient=value/10;
if(quotient!=0)
binary_to_ascii (quotient);
putchar(value%10+'0'); // 0+‘0’=‘0’ 1+‘0’=‘1’ 48+0=48 48+1=49’
}
改进打印所有数以字符
#include
void print_number(int number)
{
if(number<0)
{
putchar('-');
number=-number; 负数不能余运算,所以变正数
}
if(number/10) ///这里一定是(number/10)或写清晰是(number/10)!=0不能number
{ 或number!=0 下面讲下,这么写不是啰嗦
print_number(number/10);
}
putchar(number%10+'0');
}
int main(void)
{
void print_number(int);
int ch_number;
scanf ("%d",&ch_number);
print_number(ch_number);
printf ("\n");
return 0;
}
这个程序是这样的如15 进栈为15 除以10为1 余运算1 再出栈为15 余运算5 输出15
如123456 堆栈如下
1
12
123
1234
12345
123456
最后出栈顺序输出是 1余运算是1输出1 12余运算是2 输出2 123余3 输出3 1234余4 输出4最后123456余运算是6输出6 最后一个一个排在一起是123456
关于number/10 如果写number就会再除以10 所以输出会看到前面多个0 例子:
123/10=12 12!=0 12/10=1 1!=0 1/10=0 终止 此刻栈区变量有
123 12 1 0 所以最终输出是0123 也不需要非要number/10 number可以除以的数不能过小也不能过大,最后一个数是0-9范围,所以要大于9的整数,至于范围不能确定,因为你输入的数的位数在变,大小随机,所以结果可能异常。选9和11是稳定的,这个没仔细算过,也不能保证。