用递归写了几个小实例。
递归如果简单的话,配合return和?:只有一句话,看着挺震撼的。
递归求正整数幂
int powInteger(int base,int power)
{
return power==0?1:(base*powInteger(base,power-1));
}
原理也很简单,如果幂为0就返回1,不为0时利用x^n=x·x ^n-1
当然0的0次幂是错的
递归求整数长
int lenInteger(int n)
{
return (n/10==0)?1:1+lenInteger(n/10);
//The condition cannot be written as n==0 cuz lenInteger(0) should be 1
}
原理:个位数就返回1,否则返回1+去除最低位的长度
条件不能写成n==0就返回1或者0,不然个位数会出错。
递归求逆数
已知问题:数字中如果有0会被吞掉,原因是0会影响strlen算位数
int reverse(int n)
{
if(lenInteger(n)==1) return n;
else
{
int standard=powInteger(10,lenInteger(n)-1);
return n/standard+10*reverse(n%standard);
}
}
standard是用来取最高位数的,是10的长度-1次方。
到个位就返回本身,不然就取下高位和原来的组装,每次乘以10保证了位数正确。
递归求和
int sum(int *a,int inf,int sup)
{
if(inf==sup)
return a[inf];
else
return a[inf]+sum(a,inf+1,sup);
}
这个挺好理解的。
inf是下标的下确界,sup是下标的上确界。
递归找最大
int max(int *a,int inf,int sup)
{
if(inf==sup) return a[inf];
if(inf=sup-1)
return a[inf]>a[sup]?a[inf]:a[sup];
else
return (a[inf]>max(a,inf+1,sup))?a[inf]:(max(a,inf+1,sup));
}
inf是下标的下确界,sup是下标的上确界。
如果区间只有1个数,返回自己。
如果区间只有两个数,比大小后返回较大的那个。
不然返回端点值和去掉端点值后的数组中的最大值的较大值。。