练习:递归 斐波那契数列

package Day06;

/**

  • 1、实现代码:按顺序打印一个数字的每一位(例如1234 打印出1 2 3 4)
  • 2、实现代码:写一个递归方法,输入一个非负整数,返回组成它的数字之和.
    1. 使用for实现斐波那契数列 传入位数 ,求 第n位的值
    1. 传入一个值,判断该值在斐波那契数列的第几位上,如果没有就返回-1,如果有就返回位数
  • @author 10099

*/
public class digui_fabanacci {

public static void main(String[] args) {

	m1(1234);// 调用m1

	System.out.println(m2(1234));// 调用m2并输出

	m3(64);
	System.out.println(m4(8));

	System.out.println(m5(64));
}

// 1.实现代码:按顺序打印一个数字的每一位(例如1234 打印出1 2 3 4)
// 思路 深入最后 依次弹栈
// System.out.println(num/10/10/10%10);
// System.out.println(num/10/10%10);
// System.out.println(num/10%10);
// System.out.println(num%10);
public static void m1(int num) {
	if (num > 9) {
		m1(num / 10);
	}
	System.out.println(num % 10);
}

// 2.实现代码:写一个递归方法,输入一个非负整数,返回组成它的数字之和.
// 思路123%10+123/10%10+123/10/10%10 int返回整数类型
public static int m2(int num) {
	if (num < 10) {
		return num;
	}
	return num % 10 + m2(num / 10);
	// 再用方法加上递归输出其余的数字
}

// .3. 使用for实现斐波那契数列 传入位数 ,求 第n位的值
public static void m3(int n) {
	if (n < 1) {
		System.out.println("位数不正确");
		return;
	}
	if (n == 1 || n == 2) {
		System.out.println(1);
		return;
	}
	// 当包含三位及以上的位数
	long a = 1;// 默认表示第一位
	long b = 1;// 默认表示第二位
	long c = 1;// 默认表示第三位
	for (int i = 3; i <= n; i++) {
		c = a + b;
		a = b; // 用a表示(n-2)
		b = c; // 用b表示(n-1)
	}
	System.out.println(c);
}

// 4. 传入一个值,判断该值在斐波那契数列的第几位上,
// 如果没有就返回-1,如果有就返回位数

public static int m4(int num) {
	if (num < 1) {
		return -1;
	}
	if (num == 1) {
		return 1;
	}
	for (int i = 3; true; i++) {
		long value = m5(i);// 调用下面的m5函数得到斐波那契数列的第i个值进行比较
		if (num == value) {
			return i;
		} else if (num < value) {// 如果小于第i个值对应的斐波那契数列 就停止
			return -1;
		}
	}

}

// 这里的m5跟m3返回值类型不一样
// 若返回值类型为void 可直接调用函数 m3(64)得到第64位;
// 若为int 或long要用 System.out.println(m5(64))输出得到64位;
public static long m5(long n) {
	if (n < 1) {
		System.out.println("位数不正确");
		return -1;
	}
	if (n == 1 || n == 2) {
		System.out.println(1);
		return -1;
	}
	// 当包含三位及以上的位数
	long a = 1;// 默认表示第一位
	long b = 1;// 默认表示第二位
	long c = 1;// 默认表示第三位
	for (int i = 3; i <= n; i++) {
		c = a + b;
		a = b; // 用a表示(n-2)
		b = c; // 用b表示(n-1)
	}
	return c;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值