楼主: lpgo
收起左侧

[讨论] 关于这段简单的JAVA程序中的几个疑问

[复制链接]
lpgo
 楼主| 发表于 2011-4-7 21:22:26 | 显示全部楼层
1+1+2+3+5+8+13+21+34+55+89+....................

田纳西
发表于 2011-4-7 21:27:57 | 显示全部楼层
其实非常简单,你要求f(40),按照f(n - 1) + f(n - 2)这个表达式,先要知道f(n - 1)和f(n-2),也就是f(39)和f(38),而要知道f(39)和f(38),又要知道,f(38),f(37),f(37),f(36)。对不对?直到最后,只要知道,f(1)和F(2)就知道,F(3),知道f(3)和F(2)又可知道f(4),如此下去……
lpgo
 楼主| 发表于 2011-4-7 21:43:30 | 显示全部楼层
本帖最后由 lpgo 于 2011-4-7 21:44 编辑
田纳西 发表于 2011-4-7 21:27
其实非常简单,你要求f(40),按照f(n - 1) + f(n - 2)这个表达式,先要知道f(n - 1)和f(n-2),也就是f(39)和 ...

就是说从头到尾只要经过  if (n == 1 || n == 2) 这个判断语句不符合而出现的  return f(n - 1) + f(n - 2); 所有数值全部相加。
f(1)到f(40)出现的所有数值

然后输出相加的值   语句结束!  ?

这么说没错吧 ?

田纳西
发表于 2011-4-7 21:51:33 | 显示全部楼层
你可能对中间过程结果的存储有疑问,这涉及到函数调用的机理,会用到一种叫做“堆栈”的数据结构。

当我们求f(40)的时候,程序会把函数的相应信息(实际参数,返回值,函数入口等等)保存到堆栈中(这叫做保存现场),再调用f(39),f(38),等被它调用的函数执行完毕后,再取出f(40)的信息(叫做恢复现场)。并把被调用函数的返回值传递给它。f(40)继续执行。
田纳西
发表于 2011-4-7 22:11:32 | 显示全部楼层
f(40)数字太大,你可能有点晕,我们来求f(5)。

首先调用f(5),发现index==5,调用f(4),f(3),f(4)调用f(3),f(2),得F(2)=1,F(3)调用f(2)和f(1),得到两个1,求和得到2,返回给F(3),f(3)连同f(4)调用的F(2)的返回值求和2+1=3返回给F(4)。另一边,F(3)调用f(1)和f(2)得到结果2,与f(4)的结果返回结果求和得到3+2=5返回给F(5),输出。
lpgo
 楼主| 发表于 2011-4-7 23:41:47 | 显示全部楼层
田纳西 发表于 2011-4-7 22:11
f(40)数字太大,你可能有点晕,我们来求f(5)。

首先调用f(5),发现index==5,调用f(4),f(3),f(4)调用f(3) ...

主楼的非 递归 的程序感觉比 递归程序好理解些。

return 返回的值都有标明。。

不想 if  else 语句那么不表面

伊の星
发表于 2011-4-7 23:49:22 | 显示全部楼层
递归具有更好的可阅读性
lpgo
 楼主| 发表于 2011-4-7 23:57:02 | 显示全部楼层
回复 17楼 伊の星 的帖子

额。。

估计是我还是不很理解 递归 语句吧。


public class xunhuan {
        public static void main(String arge[]){
                System.out.println (f(40));
        }
        
        public static int f(int n) {
                if (n == 1 || n == 2) {
                        return 1;
                }
                else {
                        return f(n - 1) + f(n - 2);
                }
        }
}


其中的  return 1;

我先前是理解都错了。原来这个  return 1; 是输出所有循环内出现数值的总和。

我原以为  return 1; 就是为了满足   if (n == 1 || n == 2)   这个判定语句就等着输出 1 。。

我太白了。。 刚起步 java   高手请无视我吧

伊の星
发表于 2011-4-8 00:00:20 | 显示全部楼层
回复 18楼 lpgo 的帖子

int f(int n)函数用于计算数列第n项的值,
所以return的值就是数列第n项的值。
lpgo
 楼主| 发表于 2011-4-8 00:09:14 | 显示全部楼层
回复 19楼 伊の星 的帖子



return 1;也就是返回的 n 值并结束语句  
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-4-28 02:25 , Processed in 0.111366 second(s), 15 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表