diff --git a/.gitignore b/.gitignore index b883f1f..a691bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,9 @@ *.exe + +# .NET build artifacts +bin/ +obj/ +*.dll +*.pdb +*.deps.json +*.runtimeconfig.json diff --git a/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj b/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj new file mode 100644 index 0000000..10e94ed --- /dev/null +++ b/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj @@ -0,0 +1,11 @@ + + + + Exe + net8.0 + _2021_09_22_C_ + enable + enable + + + diff --git a/Fibonacci/2021-09-22 C#/Fibonacci.cs b/Fibonacci/2021-09-22 C#/Program.cs similarity index 100% rename from Fibonacci/2021-09-22 C#/Fibonacci.cs rename to Fibonacci/2021-09-22 C#/Program.cs diff --git a/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C# b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C# new file mode 100755 index 0000000..f21ddac Binary files /dev/null and b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C# differ diff --git a/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.deps.json b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.deps.json new file mode 100644 index 0000000..6742828 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "2021-09-22 C#/1.0.0": { + "runtime": { + "2021-09-22 C#.dll": {} + } + } + } + }, + "libraries": { + "2021-09-22 C#/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.dll b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.dll new file mode 100644 index 0000000..48681e5 Binary files /dev/null and b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.dll differ diff --git a/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.pdb b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.pdb new file mode 100644 index 0000000..123259e Binary files /dev/null and b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.pdb differ diff --git a/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.runtimeconfig.json b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.runtimeconfig.json new file mode 100644 index 0000000..becfaea --- /dev/null +++ b/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.runtimeconfig.json @@ -0,0 +1,12 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.dgspec.json b/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.dgspec.json new file mode 100644 index 0000000..1e333a1 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.dgspec.json @@ -0,0 +1,61 @@ +{ + "format": 1, + "restore": { + "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj": {} + }, + "projects": { + "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj", + "projectName": "2021-09-22 C#", + "projectPath": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.117/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.g.props b/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.g.props new file mode 100644 index 0000000..cf7e7b6 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/runner/.nuget/packages/ + /home/runner/.nuget/packages/ + PackageReference + 6.8.1 + + + + + \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.g.targets b/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/2021-09-22 C#.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfo.cs b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfo.cs new file mode 100644 index 0000000..b8e09f5 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("2021-09-22 C#")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+abb7ef72f162c06828283df39232638f96675ac2")] +[assembly: System.Reflection.AssemblyProductAttribute("2021-09-22 C#")] +[assembly: System.Reflection.AssemblyTitleAttribute("2021-09-22 C#")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfoInputs.cache b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfoInputs.cache new file mode 100644 index 0000000..84f41f5 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +f8bc1392cd5f568c63ad3f375e6fcaf3396f698bfb62b76bd8b06be1dc70cb51 diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GeneratedMSBuildEditorConfig.editorconfig b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..734989b --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,13 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = _2021_09_22_C_ +build_property.ProjectDir = /home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GlobalUsings.g.cs b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GlobalUsings.g.cs new file mode 100644 index 0000000..8578f3d --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.assets.cache b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.assets.cache new file mode 100644 index 0000000..1d76457 Binary files /dev/null and b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.assets.cache differ diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.CoreCompileInputs.cache b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..216b840 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +ef67cc630d4657c3fb26a509d9385ffa015070e4255114986cba43a30e6783db diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.FileListAbsolute.txt b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..5a5dcfc --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.FileListAbsolute.txt @@ -0,0 +1,15 @@ +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.GeneratedMSBuildEditorConfig.editorconfig +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfoInputs.cache +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.AssemblyInfo.cs +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.csproj.CoreCompileInputs.cache +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.sourcelink.json +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C# +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.deps.json +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.runtimeconfig.json +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.dll +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/bin/Debug/net8.0/2021-09-22 C#.pdb +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.dll +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/refint/2021-09-22 C#.dll +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.pdb +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.genruntimeconfig.cache +/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/ref/2021-09-22 C#.dll diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.dll b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.dll new file mode 100644 index 0000000..48681e5 Binary files /dev/null and b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.dll differ diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.genruntimeconfig.cache b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.genruntimeconfig.cache new file mode 100644 index 0000000..bff1ac1 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.genruntimeconfig.cache @@ -0,0 +1 @@ +f0f9ec1db6b19a3c3f09a957fde7ed754c62098ebc1ee37058f2f20a7efed20c diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.pdb b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.pdb new file mode 100644 index 0000000..123259e Binary files /dev/null and b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.pdb differ diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.sourcelink.json b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.sourcelink.json new file mode 100644 index 0000000..3d1dab6 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/2021-09-22 C#.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"/home/runner/work/ProgrammingPractice/ProgrammingPractice/*":"https://raw.githubusercontent.com/svoff/ProgrammingPractice/abb7ef72f162c06828283df39232638f96675ac2/*"}} \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/apphost b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/apphost new file mode 100755 index 0000000..f21ddac Binary files /dev/null and b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/apphost differ diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/ref/2021-09-22 C#.dll b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/ref/2021-09-22 C#.dll new file mode 100644 index 0000000..c3edd0f Binary files /dev/null and b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/ref/2021-09-22 C#.dll differ diff --git a/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/refint/2021-09-22 C#.dll b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/refint/2021-09-22 C#.dll new file mode 100644 index 0000000..c3edd0f Binary files /dev/null and b/Fibonacci/2021-09-22 C#/obj/Debug/net8.0/refint/2021-09-22 C#.dll differ diff --git a/Fibonacci/2021-09-22 C#/obj/project.assets.json b/Fibonacci/2021-09-22 C#/obj/project.assets.json new file mode 100644 index 0000000..bbd8768 --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/project.assets.json @@ -0,0 +1,66 @@ +{ + "version": 3, + "targets": { + "net8.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net8.0": [] + }, + "packageFolders": { + "/home/runner/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj", + "projectName": "2021-09-22 C#", + "projectPath": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.117/PortableRuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/Fibonacci/2021-09-22 C#/obj/project.nuget.cache b/Fibonacci/2021-09-22 C#/obj/project.nuget.cache new file mode 100644 index 0000000..077248a --- /dev/null +++ b/Fibonacci/2021-09-22 C#/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "eHIM71Xf3bmCoZhgp1n/z44co9aBxijVqDhBLVD5dKAOL5CqL4xm4pTTE3jTb7LpuI/qPk+9DBVCSD04e2d6sQ==", + "success": true, + "projectFilePath": "/home/runner/work/ProgrammingPractice/ProgrammingPractice/Fibonacci/2021-09-22 C#/2021-09-22 C#.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciBenchmark/FibonacciBenchmark.csproj b/Fibonacci/Multiple-Implementations/FibonacciBenchmark/FibonacciBenchmark.csproj new file mode 100644 index 0000000..14494cb --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciBenchmark/FibonacciBenchmark.csproj @@ -0,0 +1,14 @@ + + + + + + + + Exe + net8.0 + enable + enable + + + diff --git a/Fibonacci/Multiple-Implementations/FibonacciBenchmark/Program.cs b/Fibonacci/Multiple-Implementations/FibonacciBenchmark/Program.cs new file mode 100644 index 0000000..0e27a77 --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciBenchmark/Program.cs @@ -0,0 +1,102 @@ +using System.Diagnostics; +using FibonacciImplementations; + +namespace FibonacciBenchmark; + +class Program +{ + static void Main(string[] args) + { + Console.WriteLine("Fibonacci Implementations Benchmark"); + Console.WriteLine("===================================="); + Console.WriteLine(); + + var implementations = new List + { + new IterativeFibonacci(), + new MemoizedFibonacci(), + new DynamicProgrammingFibonacci(), + new MatrixFibonacci(), + new RecursiveFibonacci() // Last because it's slowest + }; + + // Test different input sizes + var testCases = new[] { 10, 20, 30, 35 }; + + foreach (var n in testCases) + { + Console.WriteLine($"Calculating Fibonacci({n}):"); + Console.WriteLine("Implementation".PadRight(25) + "Result".PadRight(15) + "Time (ms)"); + Console.WriteLine(new string('-', 50)); + + foreach (var implementation in implementations) + { + // Skip recursive for large numbers to avoid excessive wait time + if (implementation is RecursiveFibonacci && n > 35) + { + Console.WriteLine($"{implementation.Name}".PadRight(25) + "SKIPPED".PadRight(15) + "(too slow)"); + continue; + } + + var stopwatch = Stopwatch.StartNew(); + long result; + + try + { + result = implementation.Calculate(n); + stopwatch.Stop(); + + Console.WriteLine($"{implementation.Name}".PadRight(25) + + $"{result}".PadRight(15) + + $"{stopwatch.ElapsedMilliseconds:F2}"); + } + catch (Exception ex) + { + stopwatch.Stop(); + Console.WriteLine($"{implementation.Name}".PadRight(25) + + "ERROR".PadRight(15) + + $"{ex.Message}"); + } + } + + Console.WriteLine(); + } + + // Performance comparison for moderate-sized numbers + Console.WriteLine("Performance Comparison (average over 100 runs):"); + Console.WriteLine("================================================"); + + const int testN = 25; + const int iterations = 100; + + Console.WriteLine($"Calculating Fibonacci({testN}) - Average over {iterations} iterations:"); + Console.WriteLine("Implementation".PadRight(25) + "Average Time (ms)"); + Console.WriteLine(new string('-', 45)); + + foreach (var implementation in implementations) + { + if (implementation is RecursiveFibonacci) + { + // Skip recursive for performance test as it's too slow + Console.WriteLine($"{implementation.Name}".PadRight(25) + "SKIPPED (too slow)"); + continue; + } + + var totalTime = 0.0; + + for (int i = 0; i < iterations; i++) + { + var stopwatch = Stopwatch.StartNew(); + implementation.Calculate(testN); + stopwatch.Stop(); + totalTime += stopwatch.Elapsed.TotalMilliseconds; + } + + var averageTime = totalTime / iterations; + Console.WriteLine($"{implementation.Name}".PadRight(25) + $"{averageTime:F4}"); + } + + Console.WriteLine(); + Console.WriteLine("Note: Recursive implementation is excluded from larger tests due to exponential time complexity."); + } +} diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations.sln b/Fibonacci/Multiple-Implementations/FibonacciImplementations.sln new file mode 100644 index 0000000..22ec6ca --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FibonacciImplementations", "FibonacciImplementations\FibonacciImplementations.csproj", "{14C60D42-1396-487E-93EA-40A0C841F6DA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FibonacciTests", "FibonacciTests\FibonacciTests.csproj", "{F62A15A4-5A47-4599-9164-17C7EF43F559}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FibonacciBenchmark", "FibonacciBenchmark\FibonacciBenchmark.csproj", "{E09968E5-98F3-4E95-A670-246435C923E5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {14C60D42-1396-487E-93EA-40A0C841F6DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {14C60D42-1396-487E-93EA-40A0C841F6DA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {14C60D42-1396-487E-93EA-40A0C841F6DA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {14C60D42-1396-487E-93EA-40A0C841F6DA}.Release|Any CPU.Build.0 = Release|Any CPU + {F62A15A4-5A47-4599-9164-17C7EF43F559}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F62A15A4-5A47-4599-9164-17C7EF43F559}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F62A15A4-5A47-4599-9164-17C7EF43F559}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F62A15A4-5A47-4599-9164-17C7EF43F559}.Release|Any CPU.Build.0 = Release|Any CPU + {E09968E5-98F3-4E95-A670-246435C923E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E09968E5-98F3-4E95-A670-246435C923E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E09968E5-98F3-4E95-A670-246435C923E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E09968E5-98F3-4E95-A670-246435C923E5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/DynamicProgrammingFibonacci.cs b/Fibonacci/Multiple-Implementations/FibonacciImplementations/DynamicProgrammingFibonacci.cs new file mode 100644 index 0000000..d11aed7 --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/DynamicProgrammingFibonacci.cs @@ -0,0 +1,29 @@ +namespace FibonacciImplementations; + +/// +/// Dynamic programming (bottom-up) implementation of Fibonacci calculation +/// Time complexity: O(n) +/// Space complexity: O(n) for the array +/// +public class DynamicProgrammingFibonacci : IFibonacci +{ + public string Name => "Dynamic Programming"; + + public long Calculate(int n) + { + if (n < 0) throw new ArgumentException("n must be non-negative"); + if (n == 0) return 0; + if (n == 1) return 1; + + var dp = new long[n + 1]; + dp[0] = 0; + dp[1] = 1; + + for (int i = 2; i <= n; i++) + { + dp[i] = dp[i - 1] + dp[i - 2]; + } + + return dp[n]; + } +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/FibonacciImplementations.csproj b/Fibonacci/Multiple-Implementations/FibonacciImplementations/FibonacciImplementations.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/FibonacciImplementations.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/IFibonacci.cs b/Fibonacci/Multiple-Implementations/FibonacciImplementations/IFibonacci.cs new file mode 100644 index 0000000..56482ff --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/IFibonacci.cs @@ -0,0 +1,19 @@ +namespace FibonacciImplementations; + +/// +/// Interface for Fibonacci number calculation implementations +/// +public interface IFibonacci +{ + /// + /// Calculate the nth Fibonacci number + /// + /// The position in the Fibonacci sequence (0-based) + /// The nth Fibonacci number + long Calculate(int n); + + /// + /// Name of the implementation for identification + /// + string Name { get; } +} diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/IterativeFibonacci.cs b/Fibonacci/Multiple-Implementations/FibonacciImplementations/IterativeFibonacci.cs new file mode 100644 index 0000000..4994e76 --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/IterativeFibonacci.cs @@ -0,0 +1,31 @@ +namespace FibonacciImplementations; + +/// +/// Iterative implementation of Fibonacci calculation +/// Time complexity: O(n) +/// Space complexity: O(1) +/// +public class IterativeFibonacci : IFibonacci +{ + public string Name => "Iterative"; + + public long Calculate(int n) + { + if (n < 0) throw new ArgumentException("n must be non-negative"); + if (n == 0) return 0; + if (n == 1) return 1; + + long prev2 = 0; + long prev1 = 1; + long current = 0; + + for (int i = 2; i <= n; i++) + { + current = prev1 + prev2; + prev2 = prev1; + prev1 = current; + } + + return current; + } +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/MatrixFibonacci.cs b/Fibonacci/Multiple-Implementations/FibonacciImplementations/MatrixFibonacci.cs new file mode 100644 index 0000000..cfae686 --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/MatrixFibonacci.cs @@ -0,0 +1,50 @@ +namespace FibonacciImplementations; + +/// +/// Matrix exponentiation implementation of Fibonacci calculation +/// Time complexity: O(log n) +/// Space complexity: O(log n) due to recursion in matrix exponentiation +/// +public class MatrixFibonacci : IFibonacci +{ + public string Name => "Matrix Exponentiation"; + + public long Calculate(int n) + { + if (n < 0) throw new ArgumentException("n must be non-negative"); + if (n == 0) return 0; + if (n == 1) return 1; + + var baseMatrix = new long[,] { { 1, 1 }, { 1, 0 } }; + var result = MatrixPower(baseMatrix, n - 1); + + return result[0, 0]; + } + + private long[,] MatrixPower(long[,] matrix, int power) + { + if (power == 1) + { + return (long[,])matrix.Clone(); + } + + if (power % 2 == 0) + { + var half = MatrixPower(matrix, power / 2); + return MatrixMultiply(half, half); + } + else + { + return MatrixMultiply(matrix, MatrixPower(matrix, power - 1)); + } + } + + private long[,] MatrixMultiply(long[,] a, long[,] b) + { + return new long[,] + { + { a[0, 0] * b[0, 0] + a[0, 1] * b[1, 0], a[0, 0] * b[0, 1] + a[0, 1] * b[1, 1] }, + { a[1, 0] * b[0, 0] + a[1, 1] * b[1, 0], a[1, 0] * b[0, 1] + a[1, 1] * b[1, 1] } + }; + } +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/MemoizedFibonacci.cs b/Fibonacci/Multiple-Implementations/FibonacciImplementations/MemoizedFibonacci.cs new file mode 100644 index 0000000..9b424fe --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/MemoizedFibonacci.cs @@ -0,0 +1,36 @@ +namespace FibonacciImplementations; + +/// +/// Memoized recursive implementation of Fibonacci calculation +/// Time complexity: O(n) +/// Space complexity: O(n) for memoization cache + O(n) for call stack +/// +public class MemoizedFibonacci : IFibonacci +{ + public string Name => "Memoized Recursive"; + + public long Calculate(int n) + { + if (n < 0) throw new ArgumentException("n must be non-negative"); + + var memo = new Dictionary(); + return CalculateWithMemo(n, memo); + } + + private long CalculateWithMemo(int n, Dictionary memo) + { + if (memo.ContainsKey(n)) + return memo[n]; + + long result; + if (n == 0) + result = 0; + else if (n == 1) + result = 1; + else + result = CalculateWithMemo(n - 1, memo) + CalculateWithMemo(n - 2, memo); + + memo[n] = result; + return result; + } +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciImplementations/RecursiveFibonacci.cs b/Fibonacci/Multiple-Implementations/FibonacciImplementations/RecursiveFibonacci.cs new file mode 100644 index 0000000..fa26eee --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciImplementations/RecursiveFibonacci.cs @@ -0,0 +1,19 @@ +namespace FibonacciImplementations; + +/// +/// Simple recursive implementation of Fibonacci calculation +/// Time complexity: O(2^n) +/// Space complexity: O(n) due to call stack +/// +public class RecursiveFibonacci : IFibonacci +{ + public string Name => "Recursive"; + + public long Calculate(int n) + { + if (n < 0) throw new ArgumentException("n must be non-negative"); + if (n == 0) return 0; + if (n == 1) return 1; + return Calculate(n - 1) + Calculate(n - 2); + } +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciTests/FibonacciTests.csproj b/Fibonacci/Multiple-Implementations/FibonacciTests/FibonacciTests.csproj new file mode 100644 index 0000000..0287a5e --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciTests/FibonacciTests.csproj @@ -0,0 +1,29 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/Fibonacci/Multiple-Implementations/FibonacciTests/GlobalUsings.cs b/Fibonacci/Multiple-Implementations/FibonacciTests/GlobalUsings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciTests/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/FibonacciTests/UnitTest1.cs b/Fibonacci/Multiple-Implementations/FibonacciTests/UnitTest1.cs new file mode 100644 index 0000000..55b9af6 --- /dev/null +++ b/Fibonacci/Multiple-Implementations/FibonacciTests/UnitTest1.cs @@ -0,0 +1,101 @@ +namespace FibonacciTests; + +using FibonacciImplementations; + +public class FibonacciTests +{ + private readonly List _implementations; + + public FibonacciTests() + { + _implementations = new List + { + new RecursiveFibonacci(), + new IterativeFibonacci(), + new MemoizedFibonacci(), + new DynamicProgrammingFibonacci(), + new MatrixFibonacci() + }; + } + + [Theory] + [InlineData(0, 0)] + [InlineData(1, 1)] + [InlineData(2, 1)] + [InlineData(3, 2)] + [InlineData(4, 3)] + [InlineData(5, 5)] + [InlineData(6, 8)] + [InlineData(7, 13)] + [InlineData(8, 21)] + [InlineData(9, 34)] + [InlineData(10, 55)] + [InlineData(15, 610)] + [InlineData(20, 6765)] + public void Calculate_ShouldReturnCorrectFibonacciNumber_ForAllImplementations(int n, long expected) + { + foreach (var implementation in _implementations) + { + var result = implementation.Calculate(n); + Assert.Equal(expected, result); + } + } + + [Fact] + public void Calculate_ShouldThrowArgumentException_ForNegativeInput() + { + foreach (var implementation in _implementations) + { + Assert.Throws(() => implementation.Calculate(-1)); + } + } + + [Fact] + public void Calculate_ShouldReturnConsistentResults_AcrossAllImplementations() + { + // Test first 25 Fibonacci numbers (avoid too large numbers for recursive implementation) + for (int n = 0; n < 25; n++) + { + long? expectedResult = null; + + foreach (var implementation in _implementations) + { + var result = implementation.Calculate(n); + + if (expectedResult == null) + { + expectedResult = result; + } + else + { + Assert.Equal(expectedResult.Value, result); + } + } + } + } + + [Fact] + public void AllImplementations_ShouldHaveUniqueName() + { + var names = _implementations.Select(impl => impl.Name).ToList(); + Assert.Equal(names.Count, names.Distinct().Count()); + } + + [Fact] + public void Calculate_ShouldHandleLargerNumbers_ForEfficientImplementations() + { + // Test larger numbers for efficient implementations (excluding recursive) + var efficientImplementations = _implementations + .Where(impl => !(impl is RecursiveFibonacci)) + .ToList(); + + const int largeN = 40; + const long expectedResult = 102334155; // F(40) + + foreach (var implementation in efficientImplementations) + { + var result = implementation.Calculate(largeN); + Assert.Equal(expectedResult, result); + } + } +} \ No newline at end of file diff --git a/Fibonacci/Multiple-Implementations/README.md b/Fibonacci/Multiple-Implementations/README.md new file mode 100644 index 0000000..a97aa5d --- /dev/null +++ b/Fibonacci/Multiple-Implementations/README.md @@ -0,0 +1,79 @@ +# Multiple Fibonacci Implementations + +This solution demonstrates various approaches to calculating Fibonacci numbers, each with different time and space complexity characteristics. + +## Implementations + +### 1. Recursive (`RecursiveFibonacci`) +- **Time Complexity**: O(2^n) - Exponential +- **Space Complexity**: O(n) - Due to call stack +- **Description**: Simple recursive implementation following the mathematical definition +- **Use Case**: Educational purposes; demonstrates the naive approach + +### 2. Iterative (`IterativeFibonacci`) +- **Time Complexity**: O(n) - Linear +- **Space Complexity**: O(1) - Constant +- **Description**: Bottom-up iterative approach using only two variables +- **Use Case**: Most efficient for general purpose use + +### 3. Memoized Recursive (`MemoizedFibonacci`) +- **Time Complexity**: O(n) - Linear (with memoization) +- **Space Complexity**: O(n) - For memoization cache + call stack +- **Description**: Recursive with caching to avoid redundant calculations +- **Use Case**: When you need to calculate multiple Fibonacci numbers + +### 4. Dynamic Programming (`DynamicProgrammingFibonacci`) +- **Time Complexity**: O(n) - Linear +- **Space Complexity**: O(n) - For the array +- **Description**: Bottom-up approach building a table of results +- **Use Case**: When you need all Fibonacci numbers up to n + +### 5. Matrix Exponentiation (`MatrixFibonacci`) +- **Time Complexity**: O(log n) - Logarithmic +- **Space Complexity**: O(log n) - Due to recursion in matrix exponentiation +- **Description**: Uses matrix multiplication and fast exponentiation +- **Use Case**: Most efficient for very large n values + +## Running the Solution + +### Build the Solution +```bash +dotnet build +``` + +### Run Tests +```bash +dotnet test +``` + +### Run Performance Benchmark +```bash +dotnet run --project FibonacciBenchmark +``` + +## Performance Results + +The benchmark demonstrates clear performance differences: + +- **Iterative**: Fastest and most memory efficient +- **Matrix Exponentiation**: Best for very large numbers (O(log n)) +- **Dynamic Programming**: Good balance, useful when you need all values up to n +- **Memoized Recursive**: Good for multiple calculations, but higher memory overhead +- **Recursive**: Exponential time complexity, only suitable for small inputs + +## Test Coverage + +The test suite includes: +- Correctness verification for known Fibonacci values +- Consistency testing across all implementations +- Edge case handling (negative inputs) +- Large number testing for efficient implementations +- Unique naming verification + +## Key Insights + +1. **Recursive** approach demonstrates the importance of algorithm optimization +2. **Iterative** shows how simple changes can dramatically improve performance +3. **Memoization** illustrates the time-space tradeoff in optimization +4. **Matrix multiplication** shows advanced mathematical approaches to optimization +5. **Dynamic Programming** demonstrates systematic bottom-up problem solving \ No newline at end of file