Wątek przeniesiony 2021-09-22 21:57 z PHP przez cerrato.

(Zadanie) Levele i punkty - nie potrafię zrozumieć C#

0

Dzień dobry,
Mam problem. Mianowicie zadanie polega na "Zaliczenie pierwszego poziomu gry wideo zapewnia graczowi 1 punkt. Za każdy kolejny zaliczony poziom przyznawane punkty zwiększają się o 1 (2 za 2 poziom, 3 za 3 itd.).
Program, który otrzymujesz, przyjmuje jako dane wejściowe liczbę przeszłych poziomów. Uzupełnij podaną funkcję, aby przyjąć tę liczbę jako argument, i rekurencyjnie oblicz i zwróć łączną liczbę punktów podanych dla wszystkich zaliczonych poziomów."

Mój problem polega na tym, że nie jestem w stanie zrozumieć dlaczego jeżeli podamy wartość zmiennej levels np. 3 to dobrym wynikiem jest wartość 6, bo moim myśleniem powinno być 5.
Moje złe rozumowanie polega na tym, że tak, podajemy wartość 3 i po sprawdzeniu pierwszych dwóch "ifów" przechodzi do ostatniego returna gdzie mamy levels + Points(levels-1) czyli
**3 + (3 -1)= 3 + 2 = 5 ** gdzieś gubię jeszcze jedną wartość.... Prośba o wytłumaczenie dla Tuka :/

using System;
using System.Collections.Generic;

namespace SoloLearn
{
    class Program
    {
        static void Main(string[] args)
        {
            int levels = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine(Points(levels));
        }        
        static int Points(int levels)
        {
            //your code goes here
                if (levels <= 0)
                {
                    return 0;
                }
                else if (levels == 1)
                {
                    return 1;
                }
                return levels + Points(levels - 1);                
        }
    }
} 
1

Za trzeci poziom będzie 3 + 2 +1 = 6,

Func<int, int> f =null; f = (p) => p == 1 ? 1 : (p + f(p -1));

4

Kluczem jest zdanie: Za każdy kolejny zaliczony poziom przyznawane punkty zwiększają się o 1 czyli

  • za ukończenie level 1 mamy 1 punkt
  • za ukończenie level 2 mamy 2 punkty + punkty za ukończenie level 1 / czyli razem 3 punkty
  • za ukończenie level 3 mamy 3 punkty + punkty za ukończenie level 2 + punkty za ukończenie level 1 / czyli razem 6 punktów

No i w sumie to jest w dziale PHP więc raczej tak :-)

<?php

function Points ( $levels ){
  if ( $levels <= 0) return 0 ;
  if ( $levels == 1 ) return 1 ;
  return $levels + Points( $levels - 1);                
}

echo Points ( 4 ) ;

**Dopisane... **

Skoro jednak w c# to skorzystałem z konwertera na stronie https://xlinesoft.com/php2dotnet/

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Reflection;
using runnerDotNet;
namespace runnerDotNet
{
	public partial class GlobalController : BaseController
	{
		public XVar code()
		{
			try
			{
				MVCFunctions.Echo(Points(new XVar(4)));
				return MVCFunctions.GetBuferContentAndClearBufer();
			}
			catch(RunnerRedirectException ex)
			{ return Redirect(ex.Message); }
		}
		public static XVar Points(dynamic levels)
		{
			if(levels <= XVar.Pack(0))
			{
				return 0;
			}
			if(levels == 1)
			{
				return 1;
			}
			return levels + Points((XVar)(levels - 1));
		}
	}
}
5
Tukanowski napisał(a):

Mój problem polega na tym, że nie jestem w stanie zrozumieć dlaczego jeżeli podamy wartość zmiennej levels np. 3 to dobrym wynikiem jest wartość 6, bo moim myśleniem powinno być 5.

  1. Podano argument startowy 3. Zaczynamy obliczenia od ostatniego returna: return 3 + Points(2).
  2. W kolejnym wywołaniu podano argument 2, znowu dochodzimy do ostatniego returna: return 2 + Points(1).
  3. W kolejnym wywołaniu podano argument 1, tym razem dochodzimy tylko do else if: return 1

Rekurencja kończy działanie, bo funkcja nie wywołała samej siebie po raz kolejny.
Teraz podstaw kolejne returny pod wywołania Points().

return 3 + Points(2) == return 3 + 2 + Points(1) == return 3 + 2 + 1
czyli return 6.

Dla lepszego zrozumienia inny zapis:
Points(3) == 3 + Points(2)
Points(2) == 2 + Points(1) (podstawiamy 2 + Points(1) za Points(2) w poprzedniej linijce)
Points(1) == 1 (podstawiamy 1 za Points(1) w poprzednich linijkach)

1

@Spine: Dziękuje bardzo za obszerne wyjaśnienia ! :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1