您的位置:首页 > 编程语言 > C语言/C++

C语言递归练习

2013-10-02 16:44 253 查看
1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。

int CannonBall(int h)
{
	if(h == 1) return 1;
	else
		return CannonBall(h-1) + pow(h,2);
}

int main(void)
{
	printf("%d\n",CannonBall(4));
	return 0;
}

2、使用C编写一个指数函数,实现n^k

int RaiseToPower(int n, int k)
{
	if(k == 0)
		return 1;
	else
		return n * RaiseToPower(n,k -1);
}

int main()
{
	printf("%d\n",RaiseToPower(3,4));
	return 0;
}

3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.

int gcd(int m, int n)
{
	if(m % n ==0)
		return n;
	else
		return gcd(n,m % n);
}

int main()
{
	printf("%d\n",gcd(18,4));
	return 0;
}

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

int DigitSum(int n)
{
	if(n < 10) 
		return n;
	else
		return ((n % 10) + DigitSum(n / 10));
}

int main()
{
	printf("%d\n",DigitSum(1729));
	return 0;
}

5、整数n的数字根是如下定义的:它是一个整数的所有数字的和,反复相加,直到只剩下一位数字为止。例如:1729的digital root按照如下的步骤计算:

step 1: 1+7+2+9 -----> 19

step 2: 1+9 -----> 10

step 3: 1+0 ------> 1

因为第三步的结果是1,所以1就是数字根的值。

写一个函数DigitalRoot(n),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。

int DigitSum(int n)
{
	if(n < 10) 
		return n;
	else
		return ((n % 10) + DigitSum(n / 10));
}

int DigitalRoot(int n)
{
	if(n < 10)
		return n;
	else
		return DigitalRoot(DigitSum(n));
}

int main()
{
	printf("%d\n",DigitalRoot(1729));
	return 0;
}

6、计算组合数C(n,k)

int Comb(int n, int k)
{
	if(k == 0 || n == k) 
		return 1; 
	else
		return (Comb(n - 1,k - 1) + Comb(n - 1,k));
}

int main()
{
	int i;
	for(i = 0; i <= 6; i++)
	{
		printf("%d ",Comb(6,i));
	}
	printf("\n");
	return 0;
}


7、将十进制数转换为二进制数:

非递归算法:

void translate(int n)  //将10进制转换为8位的二进制    
{    
    int a[10];    
    int i,j;    
    i=0;    
    while(1)    
    {    
        a[i++]=n%2;    
        if(n/2==0) break;    
        n/=2;    
    }    
    i--;    
    for(j=1; j<8-i; j++)    
    {    
        printf("0");    
    }    
    for(j=i; j>=0; j--)    
    {    
        printf("%d",a[j]);    
    }    
}

递归算法:

void binary(unsigned long n)  
{  
    int r;  
    r = n%2;  
    if(n >= 2)  
        binary(n / 2);  
    putchar('0' + r);  
    return;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: