我对这个问题的递归解决方案正确吗?

时间:2018-10-21 22:34:37

标签: c function recursion

我需要通过递归解决此问题,这是他们要求执行的操作: 编写一个递归函数,该函数需要一个正数,并从右向左返回其数字的总和(+,-),例如(例如):数字为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);
}

1 个答案:

答案 0 :(得分: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);
}

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