我正在解决有关时间和空间复杂度的各种算法问题,以更具体地进行递归调用。我下面遇到了简单的伪代码:
doSomething(m)
if m == 1 then
return 1
else
return doSomething(random(1, m));
所以我的问题是这段代码每次返回1吗? (我知道在最坏的情况下,它每次都可以选择相同的随机数并进入无限循环)。但是从实际代码的角度来讲-每次(使用Java或任何编程语言)返回的值是否均为1?
答案 0 :(得分:1)
在实践中?除了几乎不可能发生的无限循环情况外,这还可能达到最大递归深度或出现堆栈溢出错误。但这不太可能。假设分布良好的随机数生成器,则Map<JButton, Integer> caseButtons = new HashMap<>(10);
for(int i=0; i<10; i++) {
JButton button = ...
// all the other setup goes here
caseButtons.put(button, i);
}
...
public void actionPerformed(ActionEvent e){
// Get the source of the click as a MyButton
JButton source = (JButton) e.getSource();
int index = caseButtons.get(source);
...
}
在每次执行函数时平均将减半。因此,该函数平均将平均递归m
次,并且总是在最后返回log2(m)
。
答案 1 :(得分:0)
语句if m == 1 then return 1
表示算法中唯一的基本情况。基于此,我们可以确保该算法的结果(除非有可能的无限执行)为1。
答案 2 :(得分:0)
唯一的逻辑输出是:
if m == 1 then
return 1
1 as the answer.
除非random(1,m)包括1到m之间的任何数字(不包括1和m),如 1
此代码使我想起以下阶乘错字:
if (number == 0)
return 0;
应为:
if (number == 1)
return 1;
答案始终为0。
public static double factorial_Recursion(int number)
{
if (number == 0)
return 0;
else
return number*factorial_Recursion(number - 1);
}