问答详情
源自:5-8 递归函数(二)

关于(n+1)问题

为什么是getPeachNumber(n+1)不是getPeachNumber (n)

提问者:诺丁汉 2017-01-07 20:44

个回答

  • 慕UI3611446
    2017-01-16 11:45:26

    有点明白额

  • 奇幻之旅0
    2017-01-12 11:04:45

    写的很详细,看懂了,谢了

  • 慕后端3326841
    2017-01-10 05:39:22

    首先getPeachNumber(int n)就是要得到第n天剩下的桃子个数,现在就是已知getPeachNumber(10) ,要得到getPeachNumber(1)。并且知道:第二天剩桃个数=前一天剩桃个数的一半-1;那么getPeachNumber(2)=getPeachNumber(1)/2-1,同理getPeachNumber(3)=getPeachNumber(2)/2-1;依此类推,得到getPeachNumber(10)=getPeachNumber(9)/2-1。由getPeachNumber(10)有了具体值,得到终止,反推得到getPeachNumber(9),然后得到getPeachNumber(8),最终得到getPeachNumber(1)。

     这下就知道,递归关系和终止条件,就是关键。在getPeachNumber(int n)中,if终止,else里面递归。

    现在我们用n表示天数,getPeachNumber(int n)表示第n天剩桃个数,以上关系就可以表达为:getPeachNumber(n+1)=getPeachNumber(n)/2-1 ;即getPeachNumber(n)=(getPeachNumber(n+1)+1)*2;(这就是递归条件,让第n天所剩桃与第n+1天所剩桃产生关系)。

    在getPeachNumber(int n)函数中,定义num为第n天的剩桃数,所以num=getPeachNumber(n),也就有num=(getPeachNumber(n+1)+1)*2 (也就是这个关系式将第n天与第n+1天联系起来了)。

    写的有点啰嗦,不知道你明白没有。举个例(不准确但我觉得可以帮助理解):10个人排成一列,每人一个号码,且后一个人的号码是前一个人的号码的一半减一(这是递归关系)。现在只有最后一个人知道自己的号码是1(这是终止条件),那么第一个人的号码是多少呢?是不是第一个人去问第二个人,第二人问第三人,。。。最后第九人问第十人,然后的第十这个人说自己是1,然后第九人就知道自己4(这里递归关系算出来),。。。。最后第一个人得到自己的号码。


  • 周威龙
    2017-01-08 11:42:09

    因为是递归,如果你写‘getPeachNumber (n)’则函数只是重复地赋值,变量不发生改变。而‘getPeachNumber(n+1)’则是每次函数复调时赋值,变量都加上‘1’;

    也可以简单地拆分为‘n+1’和‘n’的区别。这种函数的复调都是解有序数列问题的;比如:第1人有 1 块钱,第2人比第 1 人多 1 块钱,第3人比第 2 ~~~以此类推,问第 100人有多少钱。