作为返回值的商和余数,如何传回给主函数?这是一个很有讲究的问题,方法很多,可以是用过指针传回,可以通过全局变量,可以通过结构体,可以使指针函数等。
方法一:全局变量,一个程序中出现全局变量是很难让人接受的,这里使用全局变量返回时不可取的。
方法二:结构体,结构体确实可以保存很多变量,并且传回来也是没有问题的。但是结构体所占内存较大,不提倡使用。 方法三:指针,在递归函数中,使用指针变量将值返回。
方法四:指针函数,在递归函数中将商和余数的值返回。
对比上面四种方法,从程序健壮性、可移植性、安全性等诸多方面考虑采取方法三或方法四。
递归函数的声明,采用指针变量返回商和余数。
/*******************************************************************************
** 函数名称:pass_to_return
** 函数功能:递归算法
** 入口参数:unsigned int pDividend , unsigned int pDivisor
** unsigned int *iCompany , unsigned int *iRemainder
** 出口参数:
*******************************************************************************/
extern unsigned int
pass_to_return( unsigned int iDividend , unsigned int iDivisor,
unsigned int *iCompany , unsigned int *iRemainder) ;
递归函数的详细设计,采用指针变量返回商和余数。
/*******************************************************************************
** 函数名称:pass_to_return
** 函数功能:递归算法
** 入口参数:unsigned int pDividend , unsigned int pDivisor
** unsigned int *iCompany , unsigned int *iRemainder
** 出口参数:
*******************************************************************************/
unsigned int pass_to_return( unsigned int iDividend , unsigned int iDivisor,
unsigned int *iCompany , unsigned int *iRemainder)
{
/*
* 如果被除数(iDividend)小于除数(iDivisor)
* 则商(iCompany)为0,余数(iRemainder)为被除数(iDividend)
*/
if( (iDividend) < (iDivisor) ){
*iCompany = 0 ;
*iRemainder = iDividend ;
}
/*
* 如果被除数(iDividend)等于除数(iDivisor)
* 则商(iCompany)为1,余数(iRemainder)为0
*/
else if( (iDividend) == (iDivisor) ){
*iCompany = 1 ;
*iRemainder = 0 ;
} else{
/*
* 如果被除数(iDividend)大于除数(iDivisor)
* 进行递归调用
*/
/*
* 返回递归函数
*/
pass_to_return( iDividend , (iDivisor+iDivisor) ,
iCompany , iRemainder ) ;
/*
* 商 = 2*商
*/
*iCompany += *iCompany ;
/*
* 如果余数 (*iRemainder) 大于 除数(iDivisor)
*/
if( (*iRemainder) >= iDivisor ){
/*
* 则商=商+1
*/
*iCompany += 1 ;
/*
* 余数=余数-除数
*/
*iRemainder = *iRemainder - iDivisor ;
}
}
return 0 ;
}