查看: 2365|回复: 21
收起左侧

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

[复制链接]
lpgo
发表于 2011-4-7 12:24:53 | 显示全部楼层 |阅读模式
请各位高手们不要笑话。
本人从没接触过各种编程语言

在这方面属于纯纯的小白

最近突然对编程很感兴趣  就在网上找的 JAVA 的教程看的。

刚学到 递归 这地方。。。  死活看不懂了 (我脑子笨 请不要鄙视俺


public class Fab {

public static void main(String[] args) {

System.out.println(f(40));

}



public static long f(int index) {

if(index < 1) {

System.out.println("invalid parameter!");

return -1;

}



if(index == 1 ||  index== 2) {

return 1;

}



long f1 = 1L;

long f2 = 1L;

long f = 0;



for(int i=0; i<index-2; i++) {

f = f1 + f2;

f1 = f2;

f2 = f;



}



return f;

}
}



关于 这段程序中标红字的部分。

(f(40)) 这我的理解是给F赋值40

但是下面的 index 这项到底是什么呢? 听视频讲解说是 次数 (索引次数)

那 (index == 1 || index == 2) 这段代码意思是说 执行1次 ? 2次 ?

for(int i=0; i<index-2; i++)  这段还是除了 i<index-2 这项我不大理解其他都知道

标准FOR循环语句  给 i 赋值 0      如果 i<index-2  则执行下面语句 然后继续 i<index-2 如果还是 < (也就是true)

那么 i++ 继续往下执行.

请大大们帮我说明下这个 index 具体是个什么啊 ? 索引次数 是整个语句循环的次数吗 ?





lpgo
 楼主| 发表于 2011-4-7 13:04:39 | 显示全部楼层
  都没人啊
魂之轮回
发表于 2011-4-7 13:10:16 | 显示全部楼层
没有递归啊
gxrsprite
头像被屏蔽
发表于 2011-4-7 13:43:54 | 显示全部楼层
请搞懂形参和实参,并且理解函数调用过程
闻仲
发表于 2011-4-7 14:29:17 | 显示全部楼层
回复 1楼 lpgo 的帖子

1.int index  就是定义的int类型的 index  开始中  你已经给index赋值为40   f(int index) ,f()是一个方法,返回类型是long 类型。System.out.println(f(40)); 调用了f()这个方法
2.(index == 1 || index == 2) 这是一个判断方法如果index为1或者是2的话执行下面这个方法
3.for(int i=0; i<index-2; i++)  这是一个for循环 循环的条件是每次索引 -2 并且定义i每次+1
当条件不为true时跳出循环
lpgo
 楼主| 发表于 2011-4-7 19:24:56 | 显示全部楼层
gxrsprite 发表于 2011-4-7 13:43
请搞懂形参和实参,并且理解函数调用过程

index 这是一个形参

(f(40))里面的40是实参

运行后面地方法以后 index 形参的值变成了 40

这么理解对吧?

到这一步

if(index == 1 ||  index== 2) {

return 1;

}
判断 index 值

很明显40并不等于1或2  那么继续下面得语句  否则 返回 1  语句结束 ?




lpgo
 楼主| 发表于 2011-4-7 19:27:16 | 显示全部楼层
闻仲 发表于 2011-4-7 14:29
回复 1楼 lpgo 的帖子

1.int index  就是定义的int类型的 index  开始中  你已经给index赋值为40   f(int  ...

2.(index == 1 || index == 2) 这是一个判断方法如果index为1或者是2的话执行下面这个方法
下面的方法就是 return 1  吧?

如果不是继续往下循环 ?  

也就是运行下列语句

long f1 = 1L;

long f2 = 1L;

long f = 0;



for(int i=0; i<index-2; i++) {

f = f1 + f2;

f1 = f2;

f2 = f;



}

田纳西
发表于 2011-4-7 20:47:05 | 显示全部楼层
本帖最后由 田纳西 于 2011-4-7 20:58 编辑

println方法调用函数(方法)f,传递实际参数40,编译时,编译器为其动态的开辟内存空间(当然Java是解释执行的,不过这里的方法是静态方法,所以作为形象说法也没错。),其内存储的数值是40。

下面我们来看看f(int index)函数的执行过程:

if(index < 1),条件不成立,其{}中的语句不执行。

if(index == 1 ||  index== 2)条件也不成立,其{}中的语句不执行。

然后定义了三个长整型的局部变量。

long f1 = 1L;

long f2 = 1L;

long f = 0;

分别开辟空间并赋值。

for(int i=0; i<index-2; i++)

定义局部变量i并赋值为0,这时index是40,i<40-2成立。执行循环体:

f = f1 + f2;//求和赋值给f

f1 = f2;//把f2的值赋值给f1

f2 = f;//将前一次的和赋值给f2

第一次循环,f1+f2==2,则循环结束后,f1==1,f2==f==2。

这时i自增1,检查条件i<40-2仍然成立,继续执行循环体:

结果f==3,f1==2,f2==3,然后i自增,i<40-2成立,
f==5,f1==3,f2==5。

依次下去,如果把f1,f2,f的结果排成一个数列,则每一次循环后,f都是前两项的和。这叫做非波拉锲数列。

直到i==38,循环条件i<40-2不成立时退出循环。

非波拉锲数列可以用递归实现,不过这个程序没有用递归。
lpgo
 楼主| 发表于 2011-4-7 21:09:39 | 显示全部楼层
田纳西 发表于 2011-4-7 20:47
println方法调用函数(方法)f,传递实际参数40,编译时,编译器为其动态的开辟内存空间(当然Java是解释执行 ...

是。这题本来是一个求 Fibonacci数列第40个数的值的程序。

原程序是用 递归 地方法来解决的。

顶楼的程序是用非递归的方法来实现

因为我看用 递归 方法解决的程序实在是看蒙我了   所以才想着先理解这个非 递归 程序的意思



递归 方法原程序

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);
                }
        }
}
lpgo
 楼主| 发表于 2011-4-7 21:19:59 | 显示全部楼层
我头疼在这个 递归 方法的程序

if (n == 1 || n == 2)  
return 1; }
else {
                        return f(n - 1) + f(n - 2);

这是1个判断语句   因为上面已经把40赋值给n了  

所以  n 不符合 if (n == 1 || n == 2)   这个

则继续运行   return f(n - 1) + f(n - 2)  语句

问题就在这  N = 40

那么带入以后就是  return f(40-1)+f(40-2)  
继续带入
if (n == 1 || n == 2)  
return 1;
依然不符合那么继续执行下列的
return f(n - 1) + f(n - 2)

知道n的值符合  (n == 1 || n == 2)

符合这条件时就只有 1 2了。 那么返回  return 1 。

那么值不就成1了吗?

我其实就是不理解这个 递归 语句到底怎么输出的啊?




我看这幅图解也没看懂
tu.JPG


您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-3-29 17:25 , Processed in 0.136709 second(s), 20 queries .

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

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