【问题标题】:Is my recursion solution to this problems correct?我对这个问题的递归解决方案是否正确?
【发布时间】:2018-10-21 22:34:36
【问题描述】:

我需要通过递归来解决这个问题,这是他们要求做的: 编写一个递归函数,它接受一个正数并从右到左返回其数字的总和(+,-),像这样(例如):数字是 56894,总和是 4-9+8-6+ 5=2。 再比如,数字是7762348,和是8-4+3-2+6-7+7=11。

我下面的解决方案是否正确?我尝试用很多数字编译它,它似乎是正确的,但需要确定。

这是我的递归解决方案:

int func(int num){
  if(num/10 ==0) 
    return num;
  return (num%10) - func(num/10);
}

【问题讨论】:

  • 如果它在纸上工作,在代码测试中工作包括角/边缘情况,并且不调用未定义的行为,它可能是正确的。无论如何,要求评论的“工作”代码属于codereview.stackexchange.com,而不是这里。
  • 这被标记为 [tail-recursion] - 有问题的代码使用尾调用
  • 代码也适用于func(0),因此可能扩展到“采用非负数数的函数”。

标签: c function recursion


【解决方案1】:

您的解决方案似乎是正确的——问题要求您这样做:

ABCD -> D - C + B - A

但是你的代码可以:

ABCD -> (D - (C - (B - A)))

虽然不难证明:

(D - (C - (B - A))) == (D + -1 * (C + -1 * (B - A)) == D - C + B - A

或一些类似的非正式证明。但是,如果代码计算num/10 两次而不是使用局部变量来存储商,则该代码是否被认为是正确

int func(int number) {
    int quotient = number / 10;

    if (quotient == 0) {
           return number;
    }

    return number % 10 - func(quotient);
}

另外,这似乎是一个与div()div_t 一起玩的机会:

#include <stdlib.h>  // where div() and div_t are found

int func(int number) {
    div_t result = div(number, 10);

    if (result.quot == 0) {
        return number;
    }

    return result.rem - func(result.quot);
}

可能避免在每次迭代中再次划分。

【讨论】:

  • 我得到了你的,但是当我编译我的代码时它工作正常......那么如果它以相同的方式编译会有什么问题呢?结果是一样的吗?
  • @sam0101,它们都产生相同的结果。不同之处在于我提供的示例试图做更少的工作来实现这些结果。这是从让它开始工作到试图让它正常工作的下一个微妙步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2022-10-17
  • 1970-01-01
  • 2020-11-17
相关资源
最近更新 更多