vb.net一道函数题

落雪待听梅 2019-04-27 10:49:19
第四题,用了数组,循环和递归法还是不正确
...全文
2041 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38473303 2019-06-03
  • 打赏
  • 举报
回复
里面高手真多,学习了~
raynors 2019-05-28
  • 打赏
  • 举报
回复
引用 29 楼 jhonsonzhang的回复:
Sub Main()
Console.WriteLine("请输入需要计算的项次数:")
Dim CountN = Int(Console.ReadLine) '说明问题用,NO try
Dim FoboRecursion As Func(Of Integer, Integer) = Function(n) If(n <= 1, 1, FoboRecursion(n - 1) + FoboRecursion(n - 2)) '其实标准答案就这一行代码,再+一行求和就OK,为了更好显示效果,以下代码有点冗余

Dim SumList As New List(Of Double)
For i = 1 To CountN
Dim curFobo = FoboRecursion(i)
Dim curFoboVal = 1 / curFobo
SumList.Add(curFoboVal)
Dim viewS = "1/" & curFobo
Console.WriteLine("项次:" & i & "-项值:" & viewS)
Next
Console.WriteLine("————总和:" & SumList.Sum)
Console.ReadLine()
End Sub
29楼上的你不溢出是因为你理念有问题。不是说你不会,只是说你没有考虑到那个层次。 给你n=999999999999999999,你保存这个n就溢出了。 咋们这可不是抬杠。涉及到算法运算的,一般都不使用机器运算。 高精度运算考题第一道就是让你算20位内的四则混合运算。
weixin_43405952 2019-05-28
  • 打赏
  • 举报
回复
引用 13 楼 以专业开发人员为伍 的回复:
[quote=引用 楼主 落雪待听梅 的回复:]
第四题,用了数组,循环和递归法还是不正确


这里更重要的是一个人的基础知识,例如高中和大学学过的函数——离散数学——知识,而跟具体某种工具没有直接的关系。不能靠某些乱七八糟的编程语言来学数学知识

如果没有学过正规的,而只是自己模仿一些数学符号,那么就无法完整理解设计思路。所谓“数组”是数据结构概念,所谓“循环”说到底也其裸机上也还是需要递归理解。所以语言的混乱就说明你无法很好地写出精炼和清晰的 fibinacci 和 func 函数。[/quote]这个可能就的初学者的弱项之一吧,只想到自己写软件提高效率,没考虑到所需的知识积累。
jhonsonzhang 2019-05-24
  • 打赏
  • 举报
回复
Sub Main()
Console.WriteLine("请输入需要计算的项次数:")
Dim CountN = Int(Console.ReadLine) '说明问题用,NO try
Dim FoboRecursion As Func(Of Integer, Integer) = Function(n) If(n <= 1, 1, FoboRecursion(n - 1) + FoboRecursion(n - 2)) '其实标准答案就这一行代码,再+一行求和就OK,为了更好显示效果,以下代码有点冗余

Dim SumList As New List(Of Double)
For i = 1 To CountN
Dim curFobo = FoboRecursion(i)
Dim curFoboVal = 1 / curFobo
SumList.Add(curFoboVal)
Dim viewS = "1/" & curFobo
Console.WriteLine("项次:" & i & "-项值:" & viewS)
Next
Console.WriteLine("————总和:" & SumList.Sum)
Console.ReadLine()
End Sub
jhonsonzhang 2019-05-20
  • 打赏
  • 举报
回复
请教下楼上,字符串怎么计算斐波拉契?我不懂数学,还能不懂算术?斐波拉契的计算还能不导致溢出?我也是醉了。别祸害人啊。
8988 2019-05-18
  • 打赏
  • 举报
回复
这是一道用字符串计算数列和的问题,可参考圆周率π的计算方法(可以计算到小数点后任意位)
jhonsonzhang 2019-05-03
  • 打赏
  • 举报
回复
太简单了,提示很有趣,斐波拉契。直接代码:提示注意传参的取值,过大会溢出。
Function GetFOBOUsing(CountN As Integer) As Integer
Dim FoboVarList = New List(Of Double) From {1, 1 / 2, 1 / 3}
Dim fobo1 = 2
Dim fobo2 = 3
For i = 2 To CountN - 2
Dim FoboCur = fobo1 + fobo2
FoboVarList.Add(1 / FoboCur)
fobo1 = fobo2
fobo2 = FoboCur
Next
Return FoboVarList.Sum
End Function
溢出的解释:
斐波那契数列是个神奇的数列,古埃及文明和很多阿拉伯传说里面都有它的踪影。因为数字太大,所以会导致计算溢出。但这也说明这题没什么意思,因为几次项以后,已经无限趋向0,所以就是为题而题吧。
  • 打赏
  • 举报
回复
你可以看看你贴出的书上的问题本身的描述,再看看各种解题代码,你会慢慢、逐步发现不同层面的技术概念。 看最后一个代码,对于 fibonacci 数值序列,如果使用 fibonacci 函数来表示,那么其实逻辑上最精炼,最清晰。但是从应用上来说,因为重复多次地计算 fibonacci(n) 数值,又造成了冗余。所以把 fibonacci 函数改为 fibonacci 枚举集合的方式其实是保证只计算一遍,是保证效率的基本手段。但是我们习惯了一出手就写这类代码,因为心中早就有更深地固的 fibonacci 函数理念,所以不必一开始就写 fibonacci 而是针对实用性而习惯于一开始就写 fibonacci 枚举集合。 但是回到初学者应该学会的知识的角度,那么不要从什么诡异的代码开始学。而是要从
    Function func(n As Integer)
        If n = 1 Then Return 1 Else Return func(n - 1) + 1.0 / fibonacci(n)
    End Function
 
    Function fibonacci(n As Long) As Long
        If n < 4 Then Return n Else Return fibonacci(n - 1) + fibonacci(n - 2)
    End Function
这样最基本的东西开始学起。并且是学会代码背后的思路,而不是代码本身。 这个我们就无法总是照顾到初学者。
threenewbee 2019-04-28
  • 打赏
  • 举报
回复
Function foo(n As Integer) As Single
Dim a As Integer = 1
Dim b As Integer = 2
Dim r As Single
For i = 1 To n
r += 1 / CSng(a)
b = b + a
a = b - a
Next
return r
End Function
Sub Button1_Click() ...
Dim n As Integer = Val(TextBox1.Text)
label2.Text = foo(n).ToString()
End Sub
  • 打赏
  • 举报
回复
引用 楼主 落雪待听梅 的回复:
第四题,用了数组,循环和递归法还是不正确
这里更重要的是一个人的基础知识,例如高中和大学学过的函数——离散数学——知识,而跟具体某种工具没有直接的关系。不能靠某些乱七八糟的编程语言来学数学知识 如果没有学过正规的,而只是自己模仿一些数学符号,那么就无法完整理解设计思路。所谓“数组”是数据结构概念,所谓“循环”说到底也其裸机上也还是需要递归理解。所以语言的混乱就说明你无法很好地写出精炼和清晰的 fibinacci 和 func 函数。
  • 打赏
  • 举报
回复
上面只是使用“迭代器”技术来把 fibonacci 作为一个可枚举的集合(或者看出类似数组的东西)。你当然还可以把它设计为函数:
Imports System
Imports System.IO
Imports System.Windows

Module Program
    Sub Main()
        Dim func As New Func(Of Integer, Double)(Function(n As Integer)
                                                     If n = 1 Then Return 1 Else Return func(n - 1) + 1.0 / fibonacci(n)
                                                 End Function)
        For i = 1 To 12
            Console.WriteLine("func({0})={1}", i, func(i))
        Next
        Console.WriteLine("按任意键退出.....")
        Console.ReadKey()
    End Sub

    Function fibonacci(n As Long) As Long
        If n < 4 Then Return n Else Return fibonacci(n - 1) + fibonacci(n - 2)
    End Function

End Module
同时这里仍然是使用了两种函数定义技术。 当然初学者可能只需要会写:
Imports System
Imports System.IO
Imports System.Windows

Module Program
    Sub Main()
        For i = 1 To 12
            Console.WriteLine("func({0})={1}", i, func(i))
        Next
        Console.WriteLine("按任意键退出.....")
        Console.ReadKey()
    End Sub

    Function func(n As Integer)
        If n = 1 Then Return 1 Else Return func(n - 1) + 1.0 / fibonacci(n)
    End Function

    Function fibonacci(n As Long) As Long
        If n < 4 Then Return n Else Return fibonacci(n - 1) + fibonacci(n - 2)
    End Function

End Module
回到开头,其实初学者只需要这样学会基本的函数概念。但是编程“设计时”是从需求出发的,不同的需求就有不同的形式。我不是初学者,所以我也就无法总是写成跟你一样的函数代码。
threenewbee 2019-04-28
  • 打赏
  • 举报
回复
引用 17 楼 以专业开发人员为伍 的回复:
就从历史和对 windows 系统普通的企业级应用程序的早期贡献来说,vb 远远大于 c 语言。使用 vb 的高级程序员如果遇到“底层操作”问题,直接嵌入汇编来解决。而使用 c++ 的高级程序员则是嵌入 c 语言代码来解决。vb 的功能很强,以为开发效率高(而不是运行效率最高)而闻名。只是最近20年逐步显得“被过时”了。
按照我的理解,VB似乎不支持嵌入汇编吧。有几种BASIC语言倒是支持的,比如TURE BASIC。 在VB里,要使用“汇编”是相当麻烦的事情,一般需要定义一个数组,然后手工把机器码填进去。这种方式和用C语言写病毒倒是有些相似。 VB实际上的确是一个划时代的东西,在VB之前,没有一种编程语言可以用如此简单的方式创建用户界面。在VB尚未在我国普及的时候,用VB写一些很小的程序,就可以大卖,真的很怀念那个时代。
flybirding10011 2019-04-28
  • 打赏
  • 举报
回复
引用 6 楼 <span style="color:#4788C7">以专业开发人员为伍</span>的回复:
自己翻译为 vb.net 吧。
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, double> func = null;
            var fiboList = fibonacci().Take(13).ToList();
            func = (n =>
            {
                if (n == 0)
                    return 1;
                else
                    return func(n - 1) + 1.0 / fiboList[n];
            });
            for (var i = 0; i < 13; i++)
                Console.WriteLine("func({0})={1}", i + 1, func(i));
            Console.WriteLine(".......按任意键退出");
            Console.ReadKey();
        }
        static IEnumerable<long> fibonacci()
        {
            var a = 1;
            yield return a;
            var b = 2;
            yield return b;
            loop:
            var c = a + b;
            yield return c;
            a = b;
            b = c;
            goto loop;
        }
    }
}
<br />nishizenme xiangdea
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
我希望楼主能自己分析、构思、调试、写注释,才是学习的正道。

我的程序不写注释,自己去读懂,或调试跟踪。
flybirding10011 2019-04-28
  • 打赏
  • 举报
回复
我再看看是怎么回事
flybirding10011 2019-04-28
  • 打赏
  • 举报
回复
引用 18 楼 cpongo123的回复:
引用 17 楼 以专业开发人员为伍的回复:
就从历史和对 windows 系统普通的企业级应用程序的早期贡献来说,vb 远远大于 c 语言。使用 vb 的高级程序员如果遇到“底层操作”问题,直接嵌入汇编来解决。而使用 c++ 的高级程序员则是嵌入 c 语言代码来解决。vb 的功能很强,以为开发效率高(而不是运行效率最高)而闻名。只是最近20年逐步显得“被过时”了。
<br />引用一下
<br />引用一下看看
flybirding10011 2019-04-28
  • 打赏
  • 举报
回复
引用 17 楼 以专业开发人员为伍的回复:
就从历史和对 windows 系统普通的企业级应用程序的早期贡献来说,vb 远远大于 c 语言。使用 vb 的高级程序员如果遇到“底层操作”问题,直接嵌入汇编来解决。而使用 c++ 的高级程序员则是嵌入 c 语言代码来解决。vb 的功能很强,以为开发效率高(而不是运行效率最高)而闻名。只是最近20年逐步显得“被过时”了。
<br />引用一下
  • 打赏
  • 举报
回复
就从历史和对 windows 系统普通的企业级应用程序的早期贡献来说,vb 远远大于 c 语言。使用 vb 的高级程序员如果遇到“底层操作”问题,直接嵌入汇编来解决。而使用 c++ 的高级程序员则是嵌入 c 语言代码来解决。vb 的功能很强,以为开发效率高(而不是运行效率最高)而闻名。只是最近20年逐步显得“被过时”了。
  • 打赏
  • 举报
回复
vb 的历史比较“悠久”,因此 vb.net 为了兼容 vb 所以有许多“灵活的”语法规则,例如根本不用写 return 语句:
Function fibonacci(n As Long) As Long
    If n < 4 Then
        fibonacci = n
    Else
        fibonacci = fibonacci(n - 1) + fibonacci(n - 2)
    End If
End Function
加载更多回复(9)

16,552

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧