递归函数无法按预期工作

时间:2019-04-12 01:42:07

标签: java algorithm recursion

我正在尝试编写递归函数的代码,该函数将2的幂从1打印到N,N是幂函数的参数。

Function : int powers(n)

目前,我编写了以下代码:

int powers(int n)  //here n=128 
{        
    if(n==2)
    {
        System.out.print(n);
    }        
    else if (n>2)  
    { 
        System.out.print(n +", ");   
        return powers(n/2); 
    } 
    System.out.println("");
    return 0;
} 

输出:128、64、32、16、8、4、2

预期:2、4、8、16、32、64、128

3 个答案:

答案 0 :(得分:2)

由于函数的作用是打印2的幂,因此不需要返回该值。因此,您可以按以下方式重写函数:

int powers(int N)  //here N=128 
{
    if(N==2){
        System.out.print(N + ", ");
    }
    else if (N >2)  
    {
        powers(N/2); 
        System.out.print(N + ", ");   
    } 
    System.out.println("");
    return 0;
} 

还可以使用最后一个逗号来返回上一个步骤字符串并在函数外部打印。

String powers(int N)  //here N=128 
{
    if(N==2){
        return (N + "");
    }
    String prev = powers(N/2); 
    return (prev + ", " + N);   
} 

答案 1 :(得分:1)

为什么我们要假设输入N已经是2的幂呢?此外,2 ^ 0 = 1是否也应包含在结果中?

public int power(int num) {
    if (num <= 0)
        return -1;

    else if (num <= 1) {
        System.out.print(1);
        return 1;

    } else if (num <= 2) {
        System.out.print(1 + ", " + 2);
        return 2;

    } else {
        int result = 2 * power(num / 2);
        System.out.print(", " + result);
        return result;

    }
}

即使您输入131,也可以使用。

答案 2 :(得分:1)

我认为这将是实现这一目标的一种更优雅的方法。改进应该是:

  1. 尽可能使用移位以获取一些 性能。
  2. 修复所有输入N情况下的逗号放置
  3. 外观更精美的代码

int powers(int N) //here N=128 
{
  if (N < 2) return 0;
  powers(N >> 1); // Right shifting achieves division by 2 but a lot faster.
  if (N > 3) System.out.print(", "); // Fixing comma placement for all cases of N.
  System.out.print(N);
  return 0;
}