这是一个递归函数,用于查找数字中出现的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解决。我知道这不是很有效。我还将问我的老师关于这个问题的信息。再次感谢!
答案 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;
}