通过引用递归函数传递而无需初始化引用

时间:2018-10-12 08:54:50

标签: c recursion

这是一个递归函数,用于查找数字中出现的2个数字。

示例输入:

  

221122

示例输出:

  

countTwo():4

@Override
public void save(SalaryDetail details, String tableSuffix) {
    // use tableSuffix if it is really needed
    String q = "INSERT INTO SALARY_DETAIL_TBL "
            + "                  (ID "
            + "                  ,EMP_NAME "
            + "                  ,EMP_CODE "
            + "                  ,NET_SALARY "
            + "                  ,YYYYMM "
            + "                  ,PAY_CODE "
            + "                  ,EMP_ID "
            + "                  ,PAY_CODE_DESC "
            + "                  ,REMARK "
            + "                  ,PAY_MODE ) "
            + "          VALUES (:id "
            + "                  ,:emp_name "
            + "                  ,:emp_code "
            + "                  ,:net_salary "
            + "                  ,:yyyymm "
            + "                  ,:pay_code "
            + "                  ,:emp_id "
            + "                  ,:pay_code_desc "
            + "                  ,:remark "
            + "                  ,:pay_mode)";

    MapSqlParameterSource param = new MapSqlParameterSource();
//    KeyHolder keyHolder = new GeneratedKeyHolder();
//  details.setId(((BigDecimal) keyHolder.getKeys().get("ID")).longValue());
    param.addValue("id", details.getId());
    param.addValue("emp_name", details.getEmpName());
    param.addValue("emp_code", details.getEmpCode());
    param.addValue("net_salary", details.getNetSalary());
    param.addValue("pay_code", details.getPayCode());
    param.addValue("pay_code_desc", details.getPayCodeDesc());
    param.addValue("pay_mode", details.getPayMode());
    param.addValue("remark", details.getPayRemark());
    param.addValue("yyyymm", details.getYyyymm());
    param.addValue("emp_id", details.getEmployee() != null ? details.getEmployee().getEmpId() : null);
    getNamedParameterJdbcTemplate().update(q, param);
}

由于结果尚未初始化,因此我无法递增结果,但是我也无法在递归函数中初始化结果,因为这将重置结果。

编辑:这是一个问题,除countTwo中的代码外,所有模板均如上所述编写。我们应该在countTwo中编写代码,以便main()能够运行。

Edit2:感谢您的帮助!此问题已通过使用static int解决。我知道这不是很有效。我还将问我的老师关于这个问题的信息。再次感谢!

4 个答案:

答案 0 :(得分:3)

保留此代码所有奇怪之处的方法:

  • 它必须是递归的
  • 您无法更改main,因此初始result的值是不确定的
如您所述,

实际上是将result中的countTwo2重置。但是,在开始增加之前,您需要在正确的位置。

执行此操作的方法是对函数重新排序,并在正确的位置添加用于重置值的部分:

void countTwo2(int num, int* result)
{
    if (num > 0)
    {
        countTwo2(num / 10, result);
        if ((num % 10) / 2 == 1)
        {
            *result += 1;
        }
    }
    else
        *result = 0;
}

请注意,我将递归调用上移到if-then块上方,以递增结果,并且当num为0时,我们将进行重置。这将递归地调低输入的数字,直到结束为止,然后重置result,然后一次返回一位数字,并可选地增加该值。

这不需要对您的代码进行其他更改。

正如许多人在评论和回答中所述,这显然不是一个好的实现或设计,但是如果您要在一个受限的环境中工作,那么这可能就足够了。< / p>

答案 1 :(得分:1)

我看不出有什么充分的理由将其声明为void函数,并将结果通过指针参数传回。

以下内容肯定会更干净吗?

int countTwo(int num) {
    return (num == 0) ? 0 : (num % 10 == 2) + countTwo(num / 10);
}

答案 2 :(得分:1)

作为参考,编写此类函数的 proper 方法是不使用递归。在这种情况下,编译器是否能够展开递归并不明显,因为递归调用将位于函数的中间,并且也是有条件的。

因此,从递归中获得的唯一好处是执行速度慢和堆栈峰值使用率更高。当我们可以快速执行时,为什么还要慢执行呢?您应该问您的老师这个问题,以便他们可以告诉您为什么要教它。我很想知道他们的理由。

对于专业的,非学术的程序员,编写函数的正确方法是使用循环:

int count_n (int input, int n)
{
  int result = 0;

  for(; input>0; input/=10)
  {
    if(input%10 == n)
    {
      result++;
    }
  }

  return result;
}

(此版本不适用于负数。)

答案 3 :(得分:0)

正如我之前提到的,您可以使用静态变量。 您不需要两个参数。 这是一个解决方案:@LasseVågsætherKarlsen

#include <stdio.h>
int countTwo2(long int num)
{
    static int m=0;  //static variable is initialized only once.
    if (num==0)
        return m;
    else if (num % 10 ==2)
        m=m+1;
    num=num /10;
    countTwo2(num);
}

int main()
{
    int result; long int number;
    printf("Enter the number: \n");
    scanf("%ld", &number);
    result=countTwo2(number);
    printf("countTwo2(): %d\n", result);
    return 0;
}