【问题标题】:Recursion function - need some help in writing this function递归函数 - 在编写此函数时需要一些帮助
【发布时间】:2014-11-21 17:07:33
【问题描述】:

写一个递归函数 int mod_rec(int a,int b) 采用 a 和 b 参数,返回 a 除以 b 的余数。

你不能在这个函数中使用除法运算符(/),模运算符(%)和循环。例如,函数调用 mod_rec(7,3) 和 mod_rec(3,5) 应该分别为 1 和 3。

【问题讨论】:

  • 您是否尝试过编写任何代码来解决此问题?
  • INT_MAX 在您的平台上的价值是多少? mod_rec(2000000001, 2) 是否应该使用合理的时间和内存返回?
  • 既然参数和输出都声明为int,那么函数是否需要处理负数?

标签: c


【解决方案1】:

对于无符号整数,函数看起来像

unsigned int mod_rec( unsigned int a, unsigned int b )
{
    if ( a == 0 ) return 0;
    else return a >= b ? mod_rec( a - b, b ) : a;
}  

考虑到当右操作数为零时,操作 % 是未定义的。不过,您可以添加检查 b 是否等于 0,在这种情况下返回 0。例如

unsigned int mod_rec( unsigned int a, unsigned int b )
{
    if ( a == 0 || b == 0 ) return 0;
    else return a >= b ? mod_rec( a - b, b ) : a;
}  

编辑:似乎正确的函数定义如下所示:)

unsigned int mod_rec( unsigned int a, unsigned int b )
{
    if ( b == 0 ) return 0;
    else return a >= b ? mod_rec( a - b, b ) : a;
}  

【讨论】:

  • 你的意思不是if (b == 0) return 0; 即使那些a/0 无效,它也不应该堆栈溢出。
  • @Unn 据我所知,对于 b = 0,此操作未定义。
  • @Unn 当然你可以实现包括check b == 0的功能
  • 如果b == 0 未定义,您可以离开if (!a) 结帐。
  • @EOF 不,这个检查是必要的。
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2021-12-26
  • 2020-09-08
  • 2017-02-01
相关资源
最近更新 更多